假设我在SQL中需要以下行为
QTY Table
SERIAL_NO QTY CODE
1111111 1 AA
1111112 1 AA
1111111 2 BB
1111111 4 BB
1111113 7 CC
Code Table
CODE CODE_NAME
AA NameA
BB NameB
CC NameC
Query Result
SERIAL_NO NameA NameB NameC
1111111 1 6 0
1111112 1 0 0
1111113 0 0 7
查询结果中的NameA,B,C列基本上是按各自代码分组的总和。
我如何实现这种行为?我试图掌握的最难的部分是根据代码表动态地将列添加到查询结果中。例如,如果用户添加了另一个名为DD的代码,则查询结果应自动将NameD附加到右侧,并获取该新代码的相应总和。
答案 0 :(得分:2)
如果你确实需要它,你可以通过以下方式利用PIVOT
和动态SQL
DECLARE @cols NVARCHAR(MAX), @colp NVARCHAR(MAX), @sql NVARCHAR(MAX)
SET @cols = STUFF(
(
SELECT DISTINCT ',COALESCE(' + QUOTENAME(code_name) + ',0) AS ' + QUOTENAME(code_name)
FROM code
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
SET @colp = STUFF(
(
SELECT DISTINCT ',' + QUOTENAME(code_name)
FROM code
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
SET @sql = 'SELECT serial_no, ' + @cols +
' FROM
(
SELECT serial_no, code_name, qty
FROM qty q JOIN code c
ON q.code = c.code
) x
PIVOT
(
SUM(qty) FOR code_name IN (' + @colp + ')
) p
ORDER BY serial_no'
EXECUTE(@sql)
输出:
| SERIAL_NO | NAMEA | NAMEB | NAMEC | |-----------|-------|-------|-------| | 1111111 | 1 | 6 | 0 | | 1111112 | 1 | 0 | 0 | | 1111113 | 0 | 0 | 7 |
这是 SQLFiddle 演示