当值不为空时动态选择SQL Server列名称

时间:2015-04-21 19:06:05

标签: sql sql-server pivot

我的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字段?

1 个答案:

答案 0 :(得分: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 |