Bạn có thể sử dụng tùy chọn với dynamicSQL, ÁP DỤNG ( ) và PIVOT các toán tử. Trong trường hợp này, các cột theo thứ tự kết quả, được sắp xếp theo cột Col4.
DECLARE @cols nvarchar(max),
@query nvarchar(max)
SELECT @cols =
STUFF((SELECT x.ColName
FROM (
SELECT ',' + QUOTENAME('Col' + CAST(3 + ROW_NUMBER() OVER(PARTITION BY Col1, Col2, Col3 ORDER BY Col4) AS nvarchar(10))) AS ColName,
ROW_NUMBER() OVER(PARTITION BY Col1, Col2, Col3 ORDER BY Col4) AS rn
FROM dbo.test31 CROSS APPLY (VALUES('Col'), ('Col'), ('Col')) o(Col)) x
GROUP BY x.ColName, x.rn
ORDER BY x.rn
FOR XML PATH(''), TYPE).value('.', 'nvarchar(max)'), 1, 1, '')
SET @query =
'SELECT * FROM
(
SELECT t.Col1, t.Col2, t.Col3,
''Col'' + CAST(3 + ROW_NUMBER() OVER(PARTITION BY t.Col1, t.Col2, t.Col3 ORDER BY t.Col4) AS nvarchar(10)) AS ColName,
COALESCE(CAST(o.oCol4 AS nvarchar(10)), o.oCol5, o.oCol6) AS ListValues
FROM dbo.test31 t CROSS APPLY (
SELECT oCol4, oCol5, oCol6
FROM (VALUES (t.Col4, NULL, NULL),
(NULL, t.Col5, NULL),
(NULL, NULL, t.Col6))
x(oCol4, oCol5, oCol6)
) o
) x
PIVOT
(
MAX(ListValues) FOR ColName IN(' + @cols + ')
) p'
EXEC (@query)
Bản trình diễn trên SQLFiddle
Tùy chọn với tên các cột như sau "Nhà máy, Thương hiệu, Khu vực1, Thời gian ngừng hoạt động1, Lý do1, Khu vực2, Thời gian ngừng hoạt động2, Lý do2, v.v.".
DECLARE @cols nvarchar(max),
@query nvarchar(max)
SELECT @cols =
STUFF((SELECT ',' + QUOTENAME(o.Col) AS ColName
FROM
(
SELECT *, CAST(ROW_NUMBER() OVER(PARTITION BY Plant, Brand ORDER BY Area) AS nvarchar(10)) AS rn
FROM dbo.test35) t CROSS APPLY (VALUES('Area' + t.rn), ('DownTime' + t.rn), ('Reasons' + t.rn)
) o(Col)
GROUP BY o.Col, t.rn
ORDER BY t.rn
FOR XML PATH(''), TYPE).value('.', 'nvarchar(max)'), 1, 1, '')
SET @query =
'SELECT * FROM
(
SELECT t.Plant, t.Brand, o.ColName,
COALESCE(CAST(o.Area AS nvarchar(10)), o.DownTime, o.Reasons) AS ListValues
FROM
(
SELECT Plant, Brand, Area, DownTime, Reasons,
CAST(ROW_NUMBER() OVER(PARTITION BY Plant, Brand ORDER BY Area) AS nvarchar(10)) AS rn
FROM dbo.test35) t CROSS APPLY (
SELECT Area, DownTime, Reasons, ColName
FROM (VALUES (t.Area, NULL, NULL, ''Area'' + t.rn),
(NULL, t.DownTime, NULL, ''DownTime'' + t.rn),
(NULL, NULL, t.Reasons, ''Reasons'' + t.rn))
x(Area, DownTime, Reasons, ColName)
) o
) x
PIVOT
(
MAX(ListValues) FOR ColName IN(' + @cols + ')
) p'
EXEC (@query)
Bản trình diễn trên SQLFiddle