2016-10-19 1 views
-1

Ну, есть много ссылок на сводный SQL. Но все же я не мог решить свою проблему.
Pivot SQL по году

У меня есть следующая таблица:

----------------------------------------------------------------------- 
InspectYear  PartNo PartDesc A  B  C  D 
----------------------------------------------------------------------- 
2015   001  Part 1  9  8  8  6 
2015   002  Part 2  8  8  8  6 
2014   001  Part 1  9  2  8  6 
2014   002  Part 2  8  8  8  4 

Я хочу иметь следующий результат с динамическим "InspectYear":

----------------------------------------------------------------------- 
PartNo PartDesc NewCol  2014 2015 
----------------------------------------------------------------------- 
001  Part 1 A    9  9 
001  Part 1 B    2  8 
001  Part 1 C    8  8 
001  Part 1 D    6  6 
002  Part 2 A    8  8 
002  Part 2 B    8  8 
002  Part 2 C    8  8 
002  Part 2 D    4  6 

Кто-нибудь есть идея для запроса поворота?
действительно оценен.

ответ

1

Попробуйте ниже динамического PIVOT:

DECLARE @InspectYear AS NVARCHAR(MAX),@Query AS NVARCHAR(MAX); 

SET @InspectYear = STUFF((SELECT distinct ',' + QUOTENAME(InspectYear) 
      FROM table4 c 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

SET @Query = 
';WITH data AS 
(
    SELECT InspectYear, PartNo, PartDesc, NewCol, number 
    FROM table4 
    UNPIVOT 
    (
     number 
     FOR NewCol IN (A, B, C,D) 
    ) AS unpvt 
) 
SELECT * 
FROM data 
PIVOT 
(
    SUM(number) 
    FOR InspectYear IN ('[email protected]+') 
) AS pvt 
ORDER BY PartNo, PartDesc, NewCol ' 

EXECUTE(@query) 

Примечание: Пожалуйста, обратитесь @doraemon Создать таблицу и вставить данные, ничего о

+1

Да! эта работа!! Я пишу запрос тоже ... :) – Doraemon

+1

Человек. Вы чемпион !!! – Haminteu

0

У вас должно быть UNPIVOT ваши исходные данные, а затем снова PIVOT.

Вот решение, которое я нашел. Посмотрите, соответствует ли это вашим требованиям.

CREATE TABLE table4 
(
    InspectYear INT, 
    PartNo VARCHAR(5), 
    PartDesc VARCHAR(30), 
    A INT, 
    B INT, 
    C INT, 
    D INT 
) 

INSERT INTO table4 VALUES 
(2015, '001', 'Part 1', 9, 8, 8, 6), 
(2015, '002', 'Part 2', 8, 8, 8, 6), 
(2014, '001', 'Part 1', 9, 2, 8, 6), 
(2014, '002', 'Part 2', 8, 8, 8, 4) 

;WITH data AS 
(
    SELECT InspectYear, PartNo, PartDesc, NewCol, number 
    FROM table4 
    UNPIVOT 
    (
     number 
     FOR NewCol IN (A, B, C,D) 
    ) AS unpvt 
) 
SELECT * 
FROM data 
PIVOT 
(
    SUM(number) 
    FOR InspectYear IN ([2014], [2015]) 
) AS pvt 
ORDER BY PartNo, PartDesc, NewCol 

Пришлите пожалуйста. Спасибо. :)

+0

совершенное одно решение –

+0

Привет, спасибо за это. Но это статический стержень. Мне нужен динамический ... потому что поле «InspectYear» всегда добавляется. – Haminteu

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

  • Нет связанных вопросов^_^