【问题标题】:Dynamic pivot table query with grouping in T-SQL在 T-SQL 中进行分组的动态数据透视表查询
【发布时间】:2021-10-27 00:22:53
【问题描述】:

我试图找出一个透视查询,但首先按列分组。 我的表中有以下数据:

ID Label Tag1 Tag2 Tag3 Tag4
1 A1 1 0 0 1
2 B1 0 0 1 0
2 C1 0 1 0 0
3 A1 1 1 0 0
4 B1 0 0 0 1
4 C1 1 0 0 1

我正在寻找的最终结果是这样的:

ID 1 2
1 A1 (1,0,0,1)
2 B1 (0,0,1,0) C1 (0,1,0,0)
3 A1 (1,1,0,0)
4 B1 (0,0,0,1) C1 (1,0,0,1)

在这个例子中,我最多有 2 列,但也可以是 N 列。 我之前使用过枢轴,但是这个增加了其中的标签列的额外困难。

【问题讨论】:

  • 我真的不建议这样做。您当前的设计和新的打破基本规范化原则(后者更是如此)。只需标准化您的数据。
  • Tag 的列数也是可变的吗?否则,在创建一个连接标签和标签的新列并对其进行旋转之后,这是对现有技术的相当简单的应用。
  • @JeroenMostert 不,标签列总是 4
  • 它仍然需要是动态的,@JeroenMostert,OP 说ID 的单个值可能有超过 2 行(我假设他们不知道 可能有多少行)。
  • 用 Blue Peter 的话说,@JeroenMostert:“这是我之前制作的。” Group by column and multiple Rows into One Row multiple columns

标签: sql sql-server tsql


【解决方案1】:

基于cmets,看来你正在寻找一些动态SQL

示例

Declare @SQL varchar(max) = '
Select *
 From  (
        Select ID
              ,Item = row_number() over (partition by ID order by Label)
              ,Value = concat(Label,'' ('',Tag1,'','',Tag2,'','',Tag3,'','',Tag4,'')'')
         From YourTable
       ) src
 Pivot ( max(Value) for Item in ( ' + stuff(( Select distinct ','+quotename(row_number() over (partition by ID order by Label)) 
                                              From  YourTable
                                               For XML Path('')),1,1,'') +')) pvt
'

Exec(@SQL)


Results

【讨论】:

  • 谢谢!这正是我想要的。
  • @VeniceKing 总是乐于提供帮助
猜你喜欢
  • 2021-05-25
  • 2012-08-25
  • 2022-01-20
  • 2021-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多