Đây thực sự là một trục xoay, còn được gọi là bảng chéo hoặc đôi khi chuyển vị
Một số cơ sở dữ liệu có các phương tiện chuyên dụng để làm việc đó, những cơ sở dữ liệu khác bạn phải sử dụng cú pháp nhóm. Tôi thích cái sau hơn vì nó hoạt động trên toàn cầu
Nếu đó là điều an ủi, bạn đã thực sự gần gũi!
SELECT
DIM_KEY,
MAX(CASE WHEN ATTR_NAME = 'UPC' THEN VALUE END) as UPC,
MAX(CASE WHEN ATTR_NAME = 'DAIRY_CLM' THEN VALUE END) as DAIRY_CLM,
MAX(CASE WHEN ATTR_NAME = 'KOSHER_CLM' THEN VALUE END) as KOSHER_CLM,
MAX(CASE WHEN ATTR_NAME = 'FAT' THEN VALUE END) as FAT,
MAX(CASE WHEN ATTR_NAME = 'CALORIES' THEN VALUE END) as CALORIES
FROM demo
GROUP BY DIM_KEY
Nó hoạt động như thế nào?
Chà, nếu bạn chạy phiên bản không được nhóm, không có hàm tối đa mà bạn đã có:
SELECT
DIM_KEY,
(CASE WHEN ATTR_NAME = 'UPC' THEN VALUE END),
(CASE WHEN ATTR_NAME = 'DAIRY_CLM' THEN VALUE END),
(CASE WHEN ATTR_NAME = 'KOSHER_CLM' THEN VALUE END),
(CASE WHEN ATTR_NAME = 'FAT' THEN VALUE END),
(CASE WHEN ATTR_NAME = 'CALORIES' THEN VALUE END)
FROM
demo
Sau đó, bạn sẽ thấy dữ liệu của mình trở thành "đường chéo":
3005, 123423, null, null...
3005, null, N, null...
3005, null, null, Y ...
Trong mỗi cột (mỗi dim_key) chỉ có một giá trị, các giá trị còn lại là NULL
Việc thêm vào GROUP BY và MAX khiến các giá trị này thu gọn thành một hàng vì MAX () sẽ chỉ trả về giá trị từ cột và làm cho tất cả các giá trị rỗng biến mất. Đó là thuộc tính nội tại của nhóm, dữ liệu hàng không "ở cùng nhau" - trong nhóm của một DIM_KEY cụ thể, MAX (DAIRY_CLM) có thể đến từ bất kỳ hàng nào, MAX (KOSHER_CLM) có thể đến từ bất kỳ hàng nào khác .. Trong thực tế, điều này có nghĩa là các giá trị đơn lẻ được chọn, các giá trị rỗng sẽ bị loại bỏ, tất cả chúng đều xuất hiện trên cùng một hàng ..
..và do đó, dữ liệu dọc của bạn đã đi ngang, sau khi đi qua đường chéo