[英]SQL - Multiple Rows to Columns - Pivot? Cross Table?
我有一個包含以下結果的表(來自 SQL 查詢)
ID | 類型 | 評論 |
---|---|---|
12345 | 經理評論 | 這是經理評論 |
12345 | 人力資源評論 | 這是HR評論 |
12345 | 人力資源評論 | 這是另一個 HR 評論 |
54321 | 經理評論 | 這是經理評論 |
54321 | 經理評論 | 這是另一個經理評論 |
54321 | 經理評論 | 這也是經理的另一條評論 |
我試圖讓 output 看起來像這樣:
ID | 經理評論 1 | 經理評論 2 | 經理評論 3 | 人力資源評論 1 | 人力資源評論 2 |
---|---|---|---|---|---|
12345 | 這是HR評論 | 這是HR評論 | 這是另一個人力資源評論 | ||
54321 | 這是經理評論 | 這是另一個經理評論 | 這也是經理的另一條評論 |
此評論數可以在 0 到 5 之間變化。
我嘗試了以下方法,但它僅適用於每個部分的最新評論:
SELECT *
FROM
(
SELECT
A.[SHIFTASSIGNID] as 'ID'
,c.[COMMENTTEXT] as 'Comment Type'
,b.COMNTNOTETXT as 'Comment'
FROM [tkcsdb].[dbo].[SHFTASGNCOMNTMM] A
join [tkcsdb].[dbo].[COMNTNOTEDTL] B on
a.[COMNTNOTEID] = b.[COMNTNOTEID]
join [tkcsdb].[dbo].[COMMENTS] C
on c.commentID = a.commentID
where A.SHIFTASSIGNID = 7354246
) AS SourceTable PIVOT(max([Comment]) FOR [Type] IN([HR Notes],[Manager Notes], [Kommentar])) AS PivotTable;
顯然它不會容納多條評論,我現在已經花了大約 3 個小時在這上面,所以任何幫助都將不勝感激。
謝謝克里斯
請參閱最后的工作sql-server示例。 在示例中,我給評論一個日期,以便可以對它們進行相應的排序。
我在做什么:
我正在為每個評論文本添加一個行號,以便Manager Comment
成為Manager Comment 1
或Manager Comment 2
,具體取決於行號。
然后,由於我們知道每種類型最多有五個評論,我們可以簡單地在PIVOT
中詢問所有評論
SELECT
*
FROM (
SELECT
A.[SHIFTASSIGNID] AS 'ID'
,C.[COMMENTTEXT] + ' ' + CONVERT(NVARCHAR(20), ROW_NUMBER() OVER (PARTITION BY A.[SHIFTASSIGNID], C.[COMMENTTEXT] ORDER BY (SELECT NULL))) AS 'Comment Type'
,B.COMNTNOTETXT AS 'Comment'
FROM [tkcsdb].[dbo].[SHFTASGNCOMNTMM] A
JOIN [tkcsdb].[dbo].[COMNTNOTEDTL] B
ON A.[COMNTNOTEID] = B.[COMNTNOTEID]
JOIN [tkcsdb].[dbo].[COMMENTS] C
ON C.commentID = A.commentID
WHERE
A.SHIFTASSIGNID = 7354246
) AS SourceTable PIVOT (MAX([Comment]) FOR [Comment Type] IN ([Manager Comment 1], [Manager Comment 2], [Manager Comment 3], [Manager Comment 4], [Manager Comment 5],
[HR Comment 1], [HR Comment 2], [HR Comment 3], [HR Comment 4], [HR Comment 5])) AS PivotTable;
工作示例:
SELECT
12345 AS 'ID'
,'Manager Comment' AS 'Type'
,'This is a Manager comment' AS 'Comment'
,CONVERT(DATE, '2021-01-01') AS 'Date'
INTO #COMMENTS
UNION ALL
SELECT
12345 AS 'ID'
,'HR Comment' AS 'Type'
,'This is a HR comment' AS 'Comment'
,CONVERT(DATE, '2020-01-01') AS 'Date'
UNION ALL
SELECT
12345 AS 'ID'
,'HR Comment' AS 'Type'
,'This is another HR comment' AS 'Comment'
,CONVERT(DATE, '2021-01-01') AS 'Date'
UNION ALL
SELECT
54321 AS 'ID'
,'Manager Comment' AS 'Type'
,'This is a Manager comment' AS 'Comment'
,CONVERT(DATE, '2021-01-01') AS 'Date'
UNION ALL
SELECT
54321 AS 'ID'
,'Manager Comment' AS 'Type'
,'This is another Manager comment' AS 'Comment'
,CONVERT(DATE, '2020-01-01') AS 'Date'
UNION ALL
SELECT
54321 AS 'ID'
,'Manager Comment' AS 'Type'
,'This is another Manager comment aswell' AS 'Comment'
,CONVERT(DATE, '2019-01-01') AS 'Date';
SELECT
*
FROM (
SELECT
#COMMENTS.ID AS 'ID'
,#COMMENTS.type + ' ' + CONVERT(NVARCHAR(20), ROW_NUMBER() OVER (PARTITION BY #COMMENTS.ID, #COMMENTS.type ORDER BY #COMMENTS.DATE ASC)) AS 'Comment Type'
,#COMMENTS.Comment AS 'Comment'
FROM #COMMENTS
) AS SourceTable PIVOT (MAX([Comment]) FOR [Comment Type] IN ([Manager Comment 1], [Manager Comment 2], [Manager Comment 3], [Manager Comment 4], [Manager Comment 5],
[HR Comment 1], [HR Comment 2], [HR Comment 3], [HR Comment 4], [HR Comment 5])) AS PivotTable;
DROP TABLE #COMMENTS
我的其他答案只有在您知道或想要限制評論欄的數量時才有效。 通過這個答案,我將演示如何針對任意數量的評論執行此操作。
為此,您必須動態創建列標題並使用EXEC()
將PIVOT
查詢作為字符串執行
SELECT
12345 AS 'ID'
,'Manager Comment' AS 'Type'
,'This is a Manager comment' AS 'Comment'
,CONVERT(DATE, '2021-01-01') AS 'Date' INTO Comments
UNION ALL
SELECT
12345 AS 'ID'
,'HR Comment' AS 'Type'
,'This is a HR comment' AS 'Comment'
,CONVERT(DATE, '2020-01-01') AS 'Date'
UNION ALL
SELECT
12345 AS 'ID'
,'HR Comment' AS 'Type'
,'This is another HR comment' AS 'Comment'
,CONVERT(DATE, '2021-01-01') AS 'Date'
UNION ALL
SELECT
54321 AS 'ID'
,'Manager Comment' AS 'Type'
,'This is a Manager comment' AS 'Comment'
,CONVERT(DATE, '2021-01-01') AS 'Date'
UNION ALL
SELECT
54321 AS 'ID'
,'Manager Comment' AS 'Type'
,'This is another Manager comment' AS 'Comment'
,CONVERT(DATE, '2020-01-01') AS 'Date'
UNION ALL
SELECT
54321 AS 'ID'
,'Manager Comment' AS 'Type'
,'This is another Manager comment aswell' AS 'Comment'
,CONVERT(DATE, '2019-01-01') AS 'Date';
DECLARE @cols NVARCHAR(MAX) = '';
DECLARE @SQL NVARCHAR(MAX) = 'SELECT *
FROM (SELECT
Comments.id AS ID
,Comments.type + SPACE(1) + CONVERT(NVARCHAR(20), ROW_NUMBER() OVER (PARTITION BY Comments.id, Comments.type ORDER BY Comments.DATE ASC)) AS CommentType
,Comments.Comment AS Comment
FROM Comments) AS SourceTable PIVOT (MAX([Comment]) FOR [CommentType] IN (##COLUMNS##)) AS PivotTable;';
WITH COMMENTS1 AS
(
SELECT
Comments.id AS ID
,Comments.type + SPACE(1) + CONVERT(NVARCHAR(20), ROW_NUMBER() OVER (PARTITION BY Comments.id, Comments.type ORDER BY Comments.DATE ASC)) AS CommentType
,Comments.Comment AS Comment
FROM Comments
),
DISTINCT_COMMENTS AS
(
SELECT DISTINCT CommentType
FROM COMMENTS1
)
SELECT
@COLS = STRING_AGG('[' + DISTINCT_COMMENTS.CommentType + ']', ',')
FROM DISTINCT_COMMENTS;
SET @SQL = REPLACE(@SQL, '##COLUMNS##', @COLS);
EXEC(@SQL);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.