首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在多个(我的案例3)值上应用透视?

如何在多个(我的案例3)值上应用透视?
EN

Stack Overflow用户
提问于 2019-11-27 17:29:16
回答 1查看 31关注 0票数 0

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

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

我所做的如下所示(都是手动完成的,所以不共享代码,实际的代码有更多的字段,与问题无关)

第一步:声明并设置query1以在Year上透视表的IN/OUT值

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

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

第4步:声明一个字符串,在这个字符串中,我使用join语句在ID上组合了query1、query2和query3。在执行这个查询时,我得到了预期的输出。(共享第二张图像。)

我认为这可以使用UNION而不是JOIN来完成,而且也不需要旋转。

如果你能给我一个最好的方法来满足我的要求,那将是非常有帮助的。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-27 20:37:14

问题是您可能有三年以上的时间,所以我会将其设置为动态生成的SQL。

代码语言:javascript
复制
/*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)

这将生成以下查询:

代码语言:javascript
复制
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

如果我添加更多年的数据,

代码语言:javascript
复制
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")

我得到了这样的查询:

代码语言:javascript
复制
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 id
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59066982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档