これは確かにピボットであり、クロスタブとも呼ばれ、転置されることもあります
一部のデータベースにはそれを行うための専用の機能があり、その他のデータベースではグループ化構文を使用する必要があります。普遍的に機能するので、後者の方が好きです
それが慰めなら、あなたは本当に近かったです!
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
どのように機能しますか?
さて、あなたがすでに持っていたグループ化されていない、最大機能のないバージョンを実行する場合:
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
次に、データが「対角」になるのがわかります。
3005, 123423, null, null...
3005, null, N, null...
3005, null, null, Y ...
各列(dim_keyごと)には値が1つだけあり、残りはNULLです
GROUP BYとMAXを追加すると、MAX()が列から値だけを返し、すべてのnullが消えるため、これらは1つの行に折りたたまれます。これはグループ化の本質的な特性であり、行データが「一緒にとどまる」ことはありません。特定のDIM_KEYのグループ内では、MAX(DAIRY_CLM)は任意の行から取得でき、MAX(KOSHER_CLM)は他の任意の行から取得できます。実際には、これは単一の値が選択され、ヌルが破棄され、それらがすべて同じ行に表示されることを意味します。
..したがって、対角線を通過した後、垂直方向のデータは水平方向に移動しました