【发布时间】: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