[英]Dynamic Pivot Column by Substring
我有这张桌子:
itemid attributename value
6829556334057807840 Part Notes Drilling Required: No,Install Time: 30 Minutes,Fascia Trimming: Yes (minor),Visibility: Exposed
我希望能够将“值”列中的数据转换为“键值对”
Example:
ItemId Key Value
6829556334057807840 Drilling Required No
6829556334057807840 Install Time 30
6829556334057807840 Fascia Trimming Yes (minor)
但是,枢轴必须是动态的,因为“值”列可以根据列中的内容而具有多个不同的键值。
考虑数据库的规范化。 如果您有未知数据,请使用xml(自SQL Server 2005起受支持)或JSON(自SQL Server 2016起受支持)。 使用此查询作为起点:
WITH Src AS
(
SELECT * FROM (VALUES
('6829556334057807840', 'Part Notes', 'Drilling Required: No,Install Time: 30 Minutes,Fascia Trimming: Yes (minor),Visibility: Exposed')
) T(itemid, attributename, value)
), Recurse AS
(
SELECT
itemid,
SUBSTRING(value, 1, CASE WHEN CHARINDEX(',', value, 1)=0 THEN LEN(value) ELSE CHARINDEX(',', value, 1)-1 END) Item,
SUBSTRING(value, CASE WHEN CHARINDEX(',', value, 1)=0 THEN LEN(value) ELSE CHARINDEX(',', value, 1)+1 END, LEN(value)) Rest
FROM Src
UNION ALL
SELECT
itemid,
CASE WHEN CHARINDEX(',', Rest, 1)=0 THEN Rest ELSE SUBSTRING(Rest, 1, CHARINDEX(',', Rest)-1) END Item,
CASE WHEN CHARINDEX(',', Rest, 1)=0 THEN NULL ELSE SUBSTRING(Rest, CHARINDEX(',', Rest)+1, LEN(Rest)) END Rest
FROM Recurse
WHERE Rest IS NOT NULL
)
SELECT
itemid,
SUBSTRING(Item, 1, CHARINDEX(':', Item)-1) [Key],
SUBSTRING(Item, CHARINDEX(':', Item)+1, LEN(Item)) [Value]
FROM Recurse
它返回:
itemid Key Value
------------------- -------------------- -------------
6829556334057807840 Drilling Required No
6829556334057807840 Install Time 30 Minutes
6829556334057807840 Fascia Trimming Yes (minor)
6829556334057807840 Visibility Exposed
XML的另一种方式:
DECLARE @xml xml
SELECT @xml = (
SELECT CAST('<item id="' + CAST(itemid as nvarchar(100)) +'"><row><key>' +
REPLACE(REPLACE([value],',','</value></row><row><key>'),': ','</key><value>')+'</value></row></item>' as xml)
FROM YourTable
FOR XML PATH('')
)
SELECT t.v.value('../@id','bigint') ItemId,
t.v.value('key[1]','nvarchar(max)') [Key],
t.v.value('value[1]','nvarchar(max)') [Value]
FROM @xml.nodes('/item/row') as t(v)
对于您提供的表样本,输出将为:
ItemId Key Value
6829556334057807840 Drilling Required No
6829556334057807840 Install Time 30 Minutes
6829556334057807840 Fascia Trimming Yes (minor)
6829556334057807840 Visibility Exposed
这是使用XML PATH
表转换和替换后获得的XML数据:
<item id="6829556334057807840">
<row>
<key>Drilling Required</key>
<value>No</value>
</row>
<row>
<key>Install Time</key>
<value>30 Minutes</value>
</row>
<row>
<key>Fascia Trimming</key>
<value>Yes (minor)</value>
</row>
<row>
<key>Visibility</key>
<value>Exposed</value>
</row>
</item>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.