[英]SQL Server use column value as column names and convert to json array
假设我有下表 ProductValues:
产品编号 | 姓名 | 价值 |
---|---|---|
1 | 市场 | 一个 |
1 | 顾客 | 乙 |
2 | 市场 | C |
2 | 顾客 | D |
我可以按它们的 ProductID 对它们进行分组,并使用以下代码将这些值作为数组获取:
SELECT
(
SELECT Name, Value FROM ProductValues
WHERE P.ID = ProductID
FOR JSON PATH
)
FROM @ProductIDs P '@ProductIDs is a table containing the productIDs that Id like to retrieve'
这将返回以下内容:
(无列名) |
---|
[{“名称”:“市场”,“价值”:“A”},{“名称”:“客户”,“价值”:“B”}] |
[{"Name":"Market","Value":"C"},{"Name":"Customer","Value":"D"}] |
我想使用 Pivot 动态创建键值对。 我想实现以下目标:
(无列名) |
---|
[{"市场":"A"},{"客户":"B"}] |
[{"市场":"C"},{"客户":"D"}] |
查看另一个答案,我尝试了以下方法,但这不会动态设置键并且不会执行(说明 Pivot 中的“值”和“技术名称”未定义):
SELECT(
SELECT Market, Customer
FOR JSON PATH
)
FROM(
SELECT(
SELECT Name, Value FROM ProductValues
WHERE ProductID = P.ID
)
FROM @ProductIDs P
) t
PIVOT(
MAX(Value) '<--- "Value" Undefined'
FOR Name IN ( '<--- "Name" Undefined'
Market, Customer
)
) AS pvt
GROUP BY
Market, Customer
您可以使用条件聚合将 pivot 转换为 JSON:
select (
select
max(case when name = 'Market' then value end) as market,
max(case when name = 'Customer' then value end) as customer
from productvalues pv
where pv.productid = p.productid
for json path
) as js
from @ProductIDs p
SQL 服务器在设计上是声明性的。 如果您正在寻找动态列,您将需要DYNAMIC SQL 。
例子
Declare @sql nvarchar(max) = stuff( (Select Distinct ','+QUOTENAME(Name) From ProductValues FOR XML PATH('')),1,1,'')
SET @sql = 'Select B.*
From (
SELECT '+@sql+'
FROM ProductValues
PIVOT (max([Value]) FOR [Name] IN ('+@sql+')) AS pvt
) A
Cross Apply ( (Select A.* for json path ) ) B (JSONData)'
exec(@sql)
退货
JSONData
[{"Customer":"B","Market":"A"}]
[{"Customer":"D","Market":"C"}]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.