Ну, є багато посилань на 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 для відповіді № 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 ( "+@InspectYear+" )
) AS pvt
ORDER BY PartNo, PartDesc, NewCol "
EXECUTE(@query)
Примітка: Зверніться до @doraemon Створіть таблицю та вставте дані
0 для відповіді № 2
Ти мусиш 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
Будь ласка, спробуйте. Дякую. :)