2014-03-13 34 views
0

假設我想在SQL動態追加基於另一個表的列中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

這是一個動態交叉表。可以使用動態SQL。如果你有的話,你通常會在你的'表示層'中做這件事。 –

回答

2

如果你真的需要在SQL您可以通過以下方式利用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演示

相關問題