Перенос групп строк с одинаковым идентификатором в другую таблицу

У меня есть таблица 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 09.01.2019 21:51

@strawberry, пробовал .... Не сработало.

momsgoldteeth 10.01.2019 13:20
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
2
28
2

Ответы 2

Вы можете использовать (поддельную) функцию агрегирования и группировать по

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) может поступать из любой другой строки. На практике это означает, что выбираются отдельные значения, нули отбрасываются, все они появляются в одной строке.

..и, таким образом, ваши вертикальные данные стали горизонтальными после прохождения диагонали

Другие вопросы по теме