У меня есть таблица Demo1, где у меня есть несколько похожих DIM_KEY для нескольких разных ATTR_NAME (имена атрибутов). Я хочу отобразить таблицу со столбцами для DIM_KEY, UPC, DAIRY_CLM, KOSHER_CLM, FAT и CALORIES, где совпадающими значениями являются строки.
Это исходная таблица Demo1: [1]: https://imgur.com/a/KqayM1C
Вот как я хочу, чтобы он выглядел (таблица: Demo2): [2]: https://imgur.com/a/nwpoHhv
Я пробовал вставить строки из Demo1 в пустую таблицу Demo2, но это не сработало так, как я хотел. Я также не мог получить DIM_KEY таким образом. Я также пробовал использовать PIVOT, но не получил ничего, кроме ошибок. Я использую MySQL, но это также должно работать в SSMS. Предпочтительно SSMS, если бы мне пришлось выбирать один.
INSERT INTO Demo2 (UPC, DAIRY_CLM, KOSHER_CLM, FAT, CALORIES)
SELECT
(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 Demo1;
@strawberry, пробовал .... Не сработало.






Вы можете использовать (поддельную) функцию агрегирования и группировать по
INSERT INTO Demo2 (UPC, DAIRY_CLM, KOSHER_CLM, FAT, CALORIES)
SELECT min(CASE WHEN ATTR_NAME = 'UPC' THEN VALUE END) ,
min(CASE WHEN ATTR_NAME = 'DAIRY_CLM' THEN VALUE END),
min(CASE WHEN ATTR_NAME = 'KOSHER_CLM' THEN VALUE END),
min(CASE WHEN ATTR_NAME = 'FAT' THEN VALUE END),
min(CASE WHEN ATTR_NAME = 'CALORIES' THEN VALUE END)
FROM Demo1
group by DIM_KEY;
это должно работать одинаково для db ..
Это действительно сводная таблица, также называемая кросс-таблицей, или иногда транспонирование
В некоторых базах данных есть специальные средства для этого, в других вам нужно использовать синтаксис группировки. Я предпочитаю второй вариант, потому что он универсален.
Если это вас утешит, вы были действительно близки!
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) только одно значение, остальные - NULL
Добавление в GROUP BY и MAX приводит к тому, что они сворачиваются в одну строку, потому что MAX () вернет только значение из столбца и заставит все нули исчезнуть. Это внутреннее свойство группировки, что данные строки не «держатся вместе» - в группе с конкретным DIM_KEY MAX (DAIRY_CLM) может поступать из любой строки, MAX (KOSHER_CLM) может поступать из любой другой строки. На практике это означает, что выбираются отдельные значения, нули отбрасываются, все они появляются в одной строке.
..и, таким образом, ваши вертикальные данные стали горизонтальными после прохождения диагонали
Рассмотрите возможность обработки проблем с отображением данных в коде приложения.