Ini memang pivot, juga disebut tab silang, atau terkadang transpos
Beberapa database memiliki fasilitas khusus untuk melakukannya, yang lain Anda harus menggunakan sintaks pengelompokan. Saya lebih suka yang terakhir karena berfungsi secara universal
Jika itu penghiburan, kalian benar-benar dekat!
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
Bagaimana cara kerjanya?
Nah, jika Anda menjalankan versi non-grouped, no-max-functions yang sudah Anda miliki:
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
Kemudian Anda akan melihat data Anda menjadi "diagonal":
3005, 123423, null, null...
3005, null, N, null...
3005, null, null, Y ...
Di setiap kolom (per dim_key) hanya ada satu nilai, sisanya NULL
Menambahkan GROUP BY dan MAX menyebabkan ini runtuh menjadi satu baris karena MAX() hanya akan mengembalikan nilai dari kolom dan membuat semua null menghilang. Ini adalah properti intrinsik dari pengelompokan, bahwa data baris tidak "tetap bersama" - dalam grup DIM_KEY tertentu, MAX(DAIRY_CLM) dapat berasal dari baris mana pun, MAX(KOSHER_CLM) dapat berasal dari baris lain.. Dalam praktiknya ini berarti bahwa nilai tunggal diambil, null dibuang, semuanya muncul di baris yang sama..
..dan dengan demikian data vertikal Anda menjadi horizontal, setelah melalui diagonal