Использование значения соответствующего столбца для создания расширенной таблицы

Предположим, у меня есть следующая таблица. Я хочу поместить всю информацию в одну строку (развернуть таблицу по горизонтали), когда значение CallId одинаковое. Можно ли это сделать с помощью стандартного SQL?

Идентификатор вызова Тип Область Пол 0000001 Отправитель к северо-востоку М 0000001 Получатель Юг Ф 0000002 Отправитель Средний Запад Ф 0000002 Получатель Средний Запад М 0000003 Отправитель Средний Запад М 0000003 Получатель Запад М ... ... ... ...

Как мне создать таблицу, в которой

Идентификатор вызова Регион.Отправитель Регион.Получатель Пол.Отправитель Пол.Получатель 0000001 к северо-востоку Юг М Ф 0000002 Средний Запад Средний Запад Ф М 0000003 Средний Запад Запад М М ... ... ... ... ...

Ответ: да, это можно сделать. Вы можете, например. присоединиться к себе (внешнему?) или группе.

jarlh 14.04.2024 17:37
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
1
56
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

SELECT
  t.CallId,
  MAX(IIF(t.Type = 'Sender', t.Region, '')) AS Region_Sender,
  MAX(IIF(t.Type = 'Receiver', t.Region, '')) AS Region_Receiver,
  MAX(IIF(t.Type = 'Sender', t.Gender, '')) AS Gender_Sender,
  MAX(IIF(t.Type = 'Receiver', t.Gender, '')) AS Gender_Receiver
FROM YourTable t
GROUP BY
  t.CallId;

В Postgres и других системах вы можете использовать синтаксис MIN(t.Region) FILTER (WHERE t.Type = 'Sender)

Извините, что не упомянул об этом раньше, но не могли бы вы написать запрос, который работает в MSAccess? Кажется, это не работает как есть. Спасибо за ключевые слова conditional aggregation (aka Pivot).

mak 15.04.2024 15:54

Я думаю, тебе понадобится IIF здесь

Charlieface 15.04.2024 16:01

При запуске скрипта как есть возникает ошибка: '"Region.Sender"' is not a valid name. Make sure it does not include invalid characters or punctuation and that it is not too long.. Поэтому я изменил все соответствующие . на _ (например: "Region.Sender" -> "Region_Sender"). Также " кажется ненужным (например: Region.Sender -> Region_Sender). Когда я запустил код с этими исправлениями, все ячейки для столбцов "Region_Sender" и Region_Sender оказались пустыми.

mak 15.04.2024 16:40

Вместо этого используйте MAX

Charlieface 15.04.2024 16:42

Изменение с MIN на MAX сработало. Спасибо. Еще одна вещь: хотя у меня нет Postgres для тестирования, я думаю, что после слова Sender для ответа Postgres не хватает апострофа. Примечание. В моем комментарии выше должны были быть все ячейки, поскольку столбцы Region_Sender и Gender_Sender пусты. (не все ячейки столбцов "Region_Sender" и Region_Sender пусты.)

mak 15.04.2024 16:52
SELECT Sender.CallId, Receiver.Region_Receiver, Receiver.Gender_Receiver, Sender.Region_Sender, Sender.Gender_Sender
FROM (SELECT t.CallId, t.Region AS Region_Sender, t.Gender AS Gender_Sender
      FROM CallSession AS t
      WHERE t.Type = 'Sender')  AS Sender
INNER JOIN 
     (SELECT t.CallId, t.Region AS Region_Receiver, t.Gender AS Gender_Receiver
      FROM CallSession AS t
      WHERE t.Type = 'Receiver') AS Receiver
ON Sender.CallId = Receiver.CallId;

будет производить

Идентификатор вызова Регион_Получатель Пол_Получатель Регион_Отправитель Пол_Отправитель 1 Юг Ф к северо-востоку М 2 Средний Запад М Средний Запад Ф 3 Запад М Средний Запад М ... ... ... ... ...

также изменение обозначения Receiver.Region_Receiver на Receiver.[Region_Receiver] не имеет никакого значения.


TRANSFORM First(t.Region & "-" & t.Gender) AS Attributes
SELECT t.CallId
FROM CallSession AS t
GROUP BY t.CallId
PIVOT t.Type;

будет производить

Идентификатор вызова Получатель Отправитель 1 Юг-F Северо-Восток-М 2 Средний Запад-М Средний Запад-F 3 Вест-М Средний Запад-М ... ... ...

Чем это лучше условной агрегации? Это требует дополнительного соединения, поэтому менее эффективно.

Charlieface 15.04.2024 17:14

@Charlieface Спасибо, что указали на это. Я не знал. Я проголосовал за вас и принял это как ответ. Еще раз спасибо.

mak 15.04.2024 23:12

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