我只是想比较产品,这就是我需要以列格式显示产品的原因。第一列将显示属性,其余列显示每列的属性值。
简单的选择语句如下
SELECT product_Id,product_Name,product_Price ,product_Description,product_weight
from tblProduct
WHERE product_Id in (1139,1140,1144)
现在我想以下列方式显示我的输出
我知道我需要使用pivot来获得所需的输出。我试过以下方式
SELECT MAX(ISNULL([1139],'')),MAX(ISNULL([1140],'')),MAX(ISNULL([1144],''))
FROM
(
SELECT product_Id,product_Name,product_Price,product_Description,product_weight
FROM tblProduct where product_Id in (1139,1140,1144)
)s
PIVOT
(
MAX(product_Name)
FOR product_Id in ([1139],[1140],[1144])
) AS PVT
但这仅针对单个列进行,但我需要所有属性。
答案 0 :(得分:1)
由于您尝试聚合多列中存在的属性,因此您需要同时应用UNPIVOT和PIVOT函数。
UNPIVOT将获取您的列值并将其转换为行。要转出的代码与此类似:
select product_id, header, value
from
(
select product_id,
product_name,
cast(product_price as varchar(10)) product_price,
product_weight
from tblProduct
) p
unpivot
(
value
for header in (product_name, product_price, product_weight)
) unp
见SQL Fiddle with Demo。您会注意到这里有一个子查询将product_price
列转换为varchar。这是因为行中所需列的数据类型必须相同。因此,您可能必须执行数据转换才能使其正常工作。
unpivot会生成如下所示的结果:
| PRODUCT_ID | HEADER | VALUE |
---------------------------------------
| 141 | product_name | A141 |
| 141 | product_price | 200 |
| 141 | product_weight | 200gm |
数据在行中后,您可以将PIVOT函数应用于product_id
列值。
select header, [141], [142], [143], [144]
from
(
select product_id, header, value
from
(
select product_id,
product_name,
cast(product_price as varchar(10)) product_price,
product_weight
from tblProduct
) p
unpivot
(
value
for header in (product_name, product_price, product_weight)
) unp
) d
pivot
(
max(value)
for product_id in ([141], [142], [143], [144])
) piv
见SQL Fiddle with Demo。这给出了一个结果:
| HEADER | 141 | 142 | 143 | 144 |
--------------------------------------------------
| product_name | A141 | A142 | A143 | A144 |
| product_price | 200 | 300 | 4000 | 5000 |
| product_weight | 200gm | 300gm | 400gm | 100gm |
如果您希望将已知数量的product_id
值作为列,则上述版本将会很有效。但是如果你有一个未知的数字,那么你将需要实现动态SQL:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(product_id)
from tblProduct
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT header, ' + @cols + '
from
(
select product_id, header, value
from
(
select product_id,
product_name,
cast(product_price as varchar(10)) product_price,
product_weight
from tblProduct
) p
unpivot
(
value
for header in (product_name, product_price, product_weight)
) unp
) x
pivot
(
max(value)
for product_id in (' + @cols + ')
) p '
execute(@query)
见SQL Fiddle with Demo。这将生成与查询的静态/硬编码版本相同的结果。