2015-04-21 93 views
1

在我的SQL Server數據倉庫中有按訂單號和產品類型訂購數量的摘要事實表。我想用它來生成一個表格,顯示訂單組成(每種類型的數量)作爲報告的文本字段。當值不爲空時,動態選擇SQL Server列名稱

原始數據是這樣的:

ORDER_NBR PRODUCT_TYPE ORDER_QTY 
----------------------------------------- 
ABC123  PANTS  1 
ABC123  SHIRTS  1 
DEF456  SHIRTS  2 
HIJ789  JACKETS  1 
HIJ789  SHIRTS  2 
KLM012  PANTS  2 

我能夠通過使用動態支點,以得到儘可能在這裏。

ORDER_NBR JACKETS  PANTS  SHIRTS 
------------------------------------------------------- 
ABC123  (NULL)  1   1 
DEF456  (NULL)  (NULL)  2 
HIJ789  1   (NULL)  2 
KLM012  (NULL)  2   (NULL) 

現在我想談談這個數據爲如下:

ORDER_NBR ORDER_COMPOSITION 
---------------------------------- 
ABC123  1 PANTS, 1 SHIRTS 
DEF456  2 SHIRTS 
HIJ789  1 JACKETS, 2 SHIRTS 
KLM012  2 PANTS 

有沒有辦法來動態地選擇列名,僅當值不爲空值,然後將它們連接在一起成一個單一的領域?

+1

是的,當然也將是這樣做的一個令人費解的和低效的方式,但也許你可以解釋爲什麼數據庫應該這樣做舉重而不是客戶端/表示層? –

回答

2

您不需要使用PIVOT數據來獲得此結果。你可以簡單地串聯使用STUFFFOR XML PATH結果:

select 
    t1.order_nbr, 
    STUFF(
     (SELECT ', ' + cast(order_qty as varchar(10)) + ' ' + product_type 
      FROM yourtable t2 
      where t1.order_nbr = t2.order_nbr 
      FOR XML PATH ('')) 
      , 1, 1, '') AS order_composition 
from yourtable t1 
group by t1.order_nbr; 

SQL Fiddle with Demo。 PIVOT完全沒有必要得到結果。此查詢將讓你的結果,而不需要使用動態SQL:

| order_nbr | order_composition | 
|-----------|----------------------| 
| ABC123 | 1 PANTS, 1 SHIRTS | 
| DEF456 |    2 SHIRTS | 
| HIJ789 | 1 JACKETS, 2 SHIRTS | 
| KLM012 |    2 PANTS |