【问题标题】:SQL Pivot on two dynamic columns两个动态列上的 SQL Pivot
【发布时间】:2018-05-07 13:36:22
【问题描述】:

我知道堆栈溢出时有很多 PIVOT 两列,但似乎没有一个适合我的需要:(

这是我的表:

我想把它转向这个:

这是初始设置:

CREATE TABLE TblPivot
(ID         INT IDENTITY(1, 1),
 Shop    VARCHAR(MAX),
 ElementId  VARCHAR(10),
 QuestionId VARCHAR(10),
 [Value]    VARCHAR(20)
);

GO
INSERT INTO TblPivot (Shop,ElementId,QuestionId,[Value]) VALUES ('Shop1','elem10','question1','one')
GO
INSERT INTO TblPivot (Shop,ElementId,QuestionId,[Value]) VALUES ('Shop1','elem11','question1','two')
GO
INSERT INTO TblPivot (Shop,ElementId,QuestionId,[Value]) VALUES ('Shop1','elem20','question2','1')
GO
INSERT INTO TblPivot (Shop,ElementId,QuestionId,[Value]) VALUES ('Shop1','elem20','question3','p1')
GO
INSERT INTO TblPivot (Shop,ElementId,QuestionId,[Value]) VALUES ('Shop1','elem21','question2','2')
GO
INSERT INTO TblPivot (Shop,ElementId,QuestionId,[Value]) VALUES ('Shop1','elem21','question3','p2')

我怀疑这一定是 CROSS-APPLY 和 PIVOT 的问题,但我不确定如何解决这个问题。

PS:元素ID可以为null

谢谢!

【问题讨论】:

  • 使用您的连接问题和元素 (QuestionID + ISNULL(' - ' + ElementID, '')) 生成一列,然后使用动态 SQL 以该列为中心。
  • @EzLo 你是个邪恶的天才

标签: sql sql-server pivot pivot-table


【解决方案1】:

条件聚合:

select Shop,
       max(case when (QuestionId = 'question1' and ElementId = 'elem10')
                then value end) [question1- elem10],
       . . .
from TblPivot p
where QuestionId in ('question1', 'question2', 'question3') and
      ElementId in ('elem10', 'elem11', 'elem20', 'elem21')
group by Shop;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 2021-05-27
    • 1970-01-01
    相关资源
    最近更新 更多