我的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
有没有办法只在值不为null时动态选择列名和值,然后将它们连接成一个sigle字段?
答案 0 :(得分:2)
您不需要PIVOT数据来获得此结果。您可以使用STUFF
和FOR 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 |