【问题标题】:Dynamic columns using pivot使用数据透视的动态列
【发布时间】:2020-12-30 07:43:52
【问题描述】:

我有一张如下所示的表格:

主表

id bomname styleid
1 bom1 101
2 bom2 102
3 bom3 103

这是明细表

Id bomId bomKey bomValue
1 1 part cllr
2 1 unit kg
3 1 qty 123
4 1 part body
5 1 unit kg
6 1 qty 456
7 2 part slm
8 2 unit kg
9 2 qty 789
10 3 part abc
11 3 unit kg
12 3 qty 789
13 3 color red

我希望查询 styleid=101 使用 PIVOT 显示此数据列表:

part unit qty ids
cllr kg 123 [1,2,3]
body kg 456 [4,5,6]

我希望查询 styleid=103 使用 PIVOT 显示此数据列表:

part unit qty color ids
abc kg 789 red [10,11,12,13]

这是我的 SQL 代码:

DECLARE @sql nvarchar(max) = '', @col_list nvarchar(max) = ''

SET @col_list = (SELECT DISTINCT QUOTENAME(bomKey) + ','  
                 FROM BomDetail 
                 FOR XML PATH(''))

SET @col_list = LEFT(@col_list, LEN(@col_list) - 1)

SET @sql = 'SELECT ' + @col_list + 
           ' FROM
                 (SELECT bomKey, bomValue FROM BomDetail) x
             PIVOT
                 (MAX([bomValue]) FOR [bomKey] IN (' + @col_list + ')
            ) AS p'

EXEC(@sql)

但是现在查询只返回一行数据,如何修改我的SQL代码?

part unit qty
body kg 456

【问题讨论】:

  • 在您的执行官之前添加print @sql 并发布您的结果
  • 对于styleid=103,qty 应该是789 对吧?
  • @Squirrel 是的,我已经修复了

标签: sql sql-server pivot


【解决方案1】:

请试试这个!

DECLARE @sql nvarchar(max) = '', @col_list nvarchar(max) = ''

SET @col_list = (SELECT DISTINCT QUOTENAME(a.bomKey) + ','  
                 FROM DetailTable a join MainTable b on (a.bomId = b.id)
                 where b.styleid=101 --> CHANGE IT
                 FOR XML PATH(''))

SET @col_list = LEFT(@col_list, LEN(@col_list) - 1)

If Object_id('Tempdb..#Details') is not null
    Drop Table #Details

Create Table #Details (Seq Int, bomId Int,bomkey varchar(20), bomvalue varchar(20),id Int)

Insert #Details
select Row_Number() Over(Partition by d.bomkey Order by d.bomkey) Seq, d.bomId,d.bomkey, d.bomvalue,d.id 
from DetailTable d join MainTable m
on (d.bomId = m.id)
where styleid=101   --> CHANGE IT
Order by 1


SET @sql = 'SELECT ' + @col_list + 
           ',Ids FROM
                 (select bomkey, bomvalue, ''['' + stuff((select '','' + cast(id as varchar(100))  from #Details b where b.seq = a.seq for xml path('''')),1,1,'''') + '']'' Ids from #Details a ) x
             PIVOT
                 (MAX([bomvalue]) FOR [bomKey] IN ('+@col_list+')
            ) AS p'

EXEC(@sql)

注意:

  1. 在此代码的两个地方替换 StyleId
  2. 相应地替换为 MainTable 和 DetailTable

【讨论】:

  • 谢谢,您的解决方案彻底解决了我的问题,非常感谢!
猜你喜欢
  • 1970-01-01
  • 2022-01-06
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-14
相关资源
最近更新 更多