我有一个样本数据,如下。

我想对它应用旋转,这样数据看起来就像这样。

我所做的如下所示(都是手动完成的,所以不共享代码,实际的代码有更多的字段,与问题无关)
第一步:声明并设置query1以在Year上透视表的IN/OUT值

第二步:声明并设置query2透视表的状态

第三步:声明并设置query3以在Year上透视表以进行注释

第4步:声明一个字符串,在这个字符串中,我使用join语句在ID上组合了query1、query2和query3。在执行这个查询时,我得到了预期的输出。(共享第二张图像。)
我认为这可以使用UNION而不是JOIN来完成,而且也不需要旋转。
如果你能给我一个最好的方法来满足我的要求,那将是非常有帮助的。
谢谢。
发布于 2019-11-27 20:37:14
问题是您可能有三年以上的时间,所以我会将其设置为动态生成的SQL。
/*Setup Data */
DROP TABLE IF EXISTS tmptable
GO
SELECT
* INTO tmptable
FROM (VALUES(2016, 1150, NULL, 'CALCULATED', 'IN')
, (2017, 1150, 'Zum Verkauf', 'MANUAL', 'OUT')
, (2018, 1150, 'Zum Verkauf', 'MANUAL', 'IN')
, (2019, 1150, 'Zum Verkauf', 'MANUAL', 'OUT')
) a (YEAR, ID, COMMENT, STATUS, "IN/OUT")
GO
/*Start Solution */
DROP TABLE IF EXISTS #tmpyear
GO
/* Select which columns are immutable, in you case ID */
DECLARE @IDCols VARCHAR(100) = 'ID'
/* Select which columns to Pivot, as a list*/
DECLARE @PivotCols VARCHAR(100) = 'COMMENT,STATUS,IN/OUT'
DECLARE @SQL NVARCHAR(MAX)
/* Find out how many years are in the data */
SELECT DISTINCT
CAST(year AS VARCHAR(100)) [year] INTO #tmpyear
FROM tmptable t
/* Build the query */
SET @SQL = N'SELECT ' + @IDCols + ', '
SELECT
@SQL=@SQL+STRING_AGG(CAST( 'max(iif( [year]='+t.[year]+',['+c.[value]+'],''''))'
+'['+ c.[value]+' for '+ T.[year]+']' AS NVARCHAR(MAX)),',')
WITHIN GROUP (ORDER BY c.[value],T.[year])
FROM #tmpyear t
CROSS JOIN STRING_SPLIT(@PivotCols,',') c
SET @SQL = @SQL + 'FROM tmptable group by ' + @IDCols
EXEC (@SQL)这将生成以下查询:
SELECT
id
,MAX(IIF([year] = 2016, [COMMENT], '')) [COMMENT for 2016]
,MAX(IIF([year] = 2017, [COMMENT], '')) [COMMENT for 2017]
,MAX(IIF([year] = 2018, [COMMENT], '')) [COMMENT for 2018]
,MAX(IIF([year] = 2019, [COMMENT], '')) [COMMENT for 2019]
,MAX(IIF([year] = 2016, [IN/OUT], '')) [IN/OUT for 2016]
,MAX(IIF([year] = 2017, [IN/OUT], '')) [IN/OUT for 2017]
,MAX(IIF([year] = 2018, [IN/OUT], '')) [IN/OUT for 2018]
,MAX(IIF([year] = 2019, [IN/OUT], '')) [IN/OUT for 2019]
,MAX(IIF([year] = 2016, [STATUS], '')) [STATUS for 2016]
,MAX(IIF([year] = 2017, [STATUS], '')) [STATUS for 2017]
,MAX(IIF([year] = 2018, [STATUS], '')) [STATUS for 2018]
,MAX(IIF([year] = 2019, [STATUS], '')) [STATUS for 2019]
FROM tmptable
GROUP BY id如果我添加更多年的数据,
SELECT
* INTO tmptable
FROM (VALUES(2016, 1150, NULL, 'CALCULATED', 'IN')
, (2017, 1150, 'Zum Verkauf', 'MANUAL', 'OUT')
, (2018, 1150, 'Zum Verkauf', 'MANUAL', 'IN')
, (2019, 1150, 'Zum Verkauf', 'MANUAL', 'OUT')
, (2020, 1150, 'Zum Verkauf', 'MANUAL', 'IN')
, (2021, 1150, 'Zum Verkauf', 'MANUAL', 'OUT')
, (2022, 1150, NULL, 'MANUAL', 'IN')
, (2023, 1150, 'Zum Verkauf', 'MANUAL', 'OUT')
) a (YEAR, ID, COMMENT, STATUS, "IN/OUT")我得到了这样的查询:
SELECT
id
,MAX(IIF([year] = 2016, [COMMENT], '')) [COMMENT for 2016]
,MAX(IIF([year] = 2017, [COMMENT], '')) [COMMENT for 2017]
,MAX(IIF([year] = 2018, [COMMENT], '')) [COMMENT for 2018]
,MAX(IIF([year] = 2019, [COMMENT], '')) [COMMENT for 2019]
,MAX(IIF([year] = 2020, [COMMENT], '')) [COMMENT for 2020]
,MAX(IIF([year] = 2021, [COMMENT], '')) [COMMENT for 2021]
,MAX(IIF([year] = 2022, [COMMENT], '')) [COMMENT for 2022]
,MAX(IIF([year] = 2023, [COMMENT], '')) [COMMENT for 2023]
,MAX(IIF([year] = 2016, [IN/OUT], '')) [IN/OUT for 2016]
,MAX(IIF([year] = 2017, [IN/OUT], '')) [IN/OUT for 2017]
,MAX(IIF([year] = 2018, [IN/OUT], '')) [IN/OUT for 2018]
,MAX(IIF([year] = 2019, [IN/OUT], '')) [IN/OUT for 2019]
,MAX(IIF([year] = 2020, [IN/OUT], '')) [IN/OUT for 2020]
,MAX(IIF([year] = 2021, [IN/OUT], '')) [IN/OUT for 2021]
,MAX(IIF([year] = 2022, [IN/OUT], '')) [IN/OUT for 2022]
,MAX(IIF([year] = 2023, [IN/OUT], '')) [IN/OUT for 2023]
,MAX(IIF([year] = 2016, [STATUS], '')) [STATUS for 2016]
,MAX(IIF([year] = 2017, [STATUS], '')) [STATUS for 2017]
,MAX(IIF([year] = 2018, [STATUS], '')) [STATUS for 2018]
,MAX(IIF([year] = 2019, [STATUS], '')) [STATUS for 2019]
,MAX(IIF([year] = 2020, [STATUS], '')) [STATUS for 2020]
,MAX(IIF([year] = 2021, [STATUS], '')) [STATUS for 2021]
,MAX(IIF([year] = 2022, [STATUS], '')) [STATUS for 2022]
,MAX(IIF([year] = 2023, [STATUS], '')) [STATUS for 2023]
FROM tmptable
GROUP BY idhttps://stackoverflow.com/questions/59066982
复制相似问题