Сводная таблица на несколько столбцов - PullRequest
0 голосов
/ 26 февраля 2012

У меня есть запрос, который дает мне этот результат:

|SystemName    |SystemDescription   |CertificateType |CertName  |CertDate  |
----------------------------------------------------------------------------
| ABC          |Blah-blah ABC       | X             | X-865567  | 1 Jan    |
| ABC          |Blah-blah ABC       | Y             | Y-8a5567  | 2 Jan    |
| ABC          |Blah-blah ABC       | Z             | Z-86af67  | 3 Jan    |
| EFG          |Blah-blah EFG       | X             | X-8kuhkj  | 4 Jan    |
| EFG          |Blah-blah EFG       | Y             | Y-uiiou   | 5 Jan    |
| EFG          |Blah-blah EFG       | Z             | Z-8lkjhu  | 6 Jan    |
----------------------------------------------------------------------------

Мне нужно получить такой результат:

|SystemName |SystemDescription   | X-Name  | X-Date | Y-Name | Y-Date | Z-Name | Z-Date|
---------------------------------------------------------------------------------------
|ABC        | Blah-blah ABC      |X-865567 | 1 Jan  |Y-8a5567| 2 Jan  |Z-86af67| 3 Jan |
|EFG        | Blah-blah EFG      |X-8kuhkj | 4 Jan  |Y-uiiou | 5 Jan  |Z-8lkjhu| 6 Jan |
----------------------------------------------------------------------------------------

Другими словами, мне нужно поворачиваться без агрегации и, по крайней мере, с двумя столбцами не поворачиваться. Возможно ли произвести это без функций, хранимых процедур и временных таблиц? Я знаю, как легко реализовать это с помощью нескольких функций, я могу придумать решение с помощью временной таблицы.

Интересно, можно ли получить аккуратное решение, используя PIVOT ??

p.s. это не домашнее задание, просто головоломка -)

1 Ответ

1 голос
/ 27 февраля 2012

Нет необходимости использовать PIVOT для этого, иногда это скорее беспорядок, чем стоит.Если вы не используете агрегатные функции - подумайте об этом, вы хотите сгруппировать записи по SystemName и SystemDescription, у вас нет выбора, кроме как использовать агрегаты.Это нормально, просто используйте MAX, как я сделал, вы получите желаемый результат.Единственное, о чем вам следует беспокоиться, это сценарий, в котором есть две записи с одинаковыми SystemName, SystemDescription и CertificationType, которые имеют разные значения для CertName или CertDate - в этом случае вам понадобятся некоторыеспособ выбрать, какие атрибуты выбраны для группы.

Вот пример без Pivot:

SELECT SystemName,
       SystemDescription,
       MAX([x-Name]) AS [x-Name],
       MAX([x-Date]) AS [x-Date],
       MAX([y-Name]) AS [y-Name],
       MAX([y-Date]) AS [y-Date],    
       MAX([z-Name]) AS [z-Name],
       MAX([z-Date]) AS [z-Date]
FROM (
    SELECT SystemName, 
           SystemDescription,
           CASE CertificationType WHEN 'X' THEN CertName END AS [x-Name],
           CASE CertificationType WHEN 'Y' THEN CertName END AS [y-Name],
           CASE CertificationType WHEN 'Z' THEN CertName END AS [z-Name],
           CASE CertificationType WHEN 'X' THEN CertDate END AS [x-Date],
           CASE CertificationType WHEN 'Y' THEN CertDate END AS [y-Date],
           CASE CertificationType WHEN 'Z' THEN CertDate END AS [z-Date]
    FROM @yourTable
) T
GROUP BY SystemName, SystemDescription;
...