根据SQL中的另一个表动态附加列

时间:2014-03-13 02:14:54

标签: sql sql-server-2008

假设我在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附加到右侧,并获取该新代码的相应总和。

1 个答案:

答案 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 演示