sql正在将一行转换为具有未知数量的不同值的列

vqlkdk9b  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(409)

我有以下数据库

id  item_id  date        system_code  value

# 1  0001     01-01-2019  0999         10

# 2  0001     02-01-2019  0888         15

# 3  0001     01-01-2019  0999         10

# 4  0002     02-01-2019  0777         20

# 5  0002     03-01-2019  0777         35

我想要得到的结果是这样的,系统代码列的值是“value”的和

item_id  date        0999  0888  0777
  0001     01-01-2019  20        
  0001     02-01-2019        15
  0002     02-01-2019              20
  0002     03-01-2019              35

我的问题是系统代码有超过1000个不同的值,所以我不能手动键入它们。数据库有近十亿个条目,所以任何能够快速计算的东西都是完美的。

yr9zkbsy

yr9zkbsy1#

以防万一,这里有一个动态轴
例子

Declare @SQL varchar(max) = stuff((Select distinct  ',' + QUOTENAME([system_code]) 
                                     From YourTable
                                     Order By 1 Desc
                                    For XML Path('') )
                                   ,1,1,'') 

Set @SQL = '
Select *
 From  ( Select item_id,date,system_code,value from YourTable ) src
 Pivot ( sum(value) for system_Code in ( '+ @SQL + ') ) pvt
'

--Print @SQL
Exec(@SQL)

退货

注:
我相信最大列数是1024(宽表30000)。
就我个人而言,我不想消耗超过50列。
编辑:
如果有两个或多个列,可以通过在第一个查询中添加where来过滤列表,并可能运行两次(或更多)。结果的行数相同,只是列集不同。
例子

Declare @SQL varchar(max) = stuff((Select distinct  ',' + QUOTENAME([system_code]) 
                                   From #YourTable
                                   Where [system_code] >'0500' -- or any appropriate filter
                                   Order By 1 desc
                                   For XML Path('') )
                                  ,1,1,'')
9lowa7mx

9lowa7mx2#

可以使用条件聚合:

select item_id, date,
       max(case when system_code = '0999' then value end) as value_0999,
       max(case when system_code = '0888' then value end) as value_0888,
       max(case when system_code = '0777' then value end) as value_0777
from t
group by item_id, date;

你可以生成这个 max() 使用查询的表达式:

select distinct
       replace('max(case when system_code = '<val>' then value end) as value_<val>,',
               '<val>', system_code
              )
from t;

相关问题