2012-02-26 3 views
0

у меня есть запрос, который дает мне этот результат:Сводная таблица по нескольким столбцам

 
|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 | 
---------------------------------------------------------------------------------------- 

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

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

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

ответ

1

Для этого не нужно использовать 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; 
+0

А-ха! Я знал, что может быть очень простой способ! Спасибо! – trailmax

+0

Взял немного возиться и заявление CTE, чтобы понять это, но идея такая же! Еще раз спасибо! – trailmax

Смежные вопросы