当值不为空时动态 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 数据来获得此结果。您可以使用 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 |
我的 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 数据来获得此结果。您可以使用 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 |