Предположим, у меня есть следующая таблица. Я хочу поместить всю информацию в одну строку (развернуть таблицу по горизонтали), когда значение CallId
одинаковое. Можно ли это сделать с помощью стандартного SQL?
Как мне создать таблицу, в которой
Вы можете использовать условную агрегацию (также известную как 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)
.
Я думаю, тебе понадобится IIF
здесь
При запуске скрипта как есть возникает ошибка: '"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
оказались пустыми.
Вместо этого используйте MAX
Изменение с MIN
на MAX
сработало. Спасибо. Еще одна вещь: хотя у меня нет Postgres для тестирования, я думаю, что после слова Sender
для ответа Postgres не хватает апострофа. Примечание. В моем комментарии выше должны были быть все ячейки, поскольку столбцы Region_Sender
и Gender_Sender
пусты. (не все ячейки столбцов "Region_Sender"
и Region_Sender
пусты.)
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;
будет производить
также изменение обозначения 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;
будет производить
Чем это лучше условной агрегации? Это требует дополнительного соединения, поэтому менее эффективно.
@Charlieface Спасибо, что указали на это. Я не знал. Я проголосовал за вас и принял это как ответ. Еще раз спасибо.
Ответ: да, это можно сделать. Вы можете, например. присоединиться к себе (внешнему?) или группе.