当值不为空时动态 Select SQL 服务器列名称

Dynamically Select SQL Server Column Names When Value is Not Null

我的 SQL 服务器数据仓库中有一个摘要事实 table,其中包含按订单号和产品类型分类的订单数量。我想用它来生成一个 table 显示订单组成(每种类型的数量)作为报告的文本字段。

原始数据是这样的:

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

有没有办法动态地 select 只有当值不为 null 时列名和值,然后将它们连接在一起成为一个字段?

您不需要 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 |