[英]SQL Extracting Data from Column
寻找一些SQL帮助来从表中的列中选择特定数据,并以此创建新列。 这是AttributeDescription
列中的数据示例:
AttributeDescription
----------------------------------
Color: black<br />Size: L
Color: black<br />Size: M
Color: black<br />Size: S
Colour: turquoise<br />Size: XXL
Colour: white<br />Size: M
Colour: white<br />Size: XL
Model: iPhone 5/5s
Model: iPhone 6
Size: 2X-Large
Size: Large
Size: Medium
Size: Medium / Small
Size: Small
Size: XL
Size: X-Large
Size: X-Large / Large`
我想将其分为三个列,分别为“ Variant_Model”,“ Variant_Size”和“ Variant_Color”。 最终结果应为:
Variant_Model |Variant_Size | Variant_Color
--------------+-------------+-------------
| L | black
| M | black
| S | black
| XXL | turquoise
| M | white
| XL | white
iPhone 5/5s | |
iPhone 6 | |
| 2X-Large |
| Large |
| Medium |
| Medium / Small|
| Small |
| XL |
| X-Large |
| X-Large / Large| `
请注意,在原始列中,该属性可能显示为“颜色”或“颜色”。
标准化缩写词(例如“ L”,“ M”)成适当单词的加分!
首先十分感谢!
一种方法是这样的
查询:
SELECT Model AS Variant_Model,
CASE
WHEN size = 'L'
THEN 'Large'
WHEN size = 'M'
THEN 'Medium'
WHEN size = 'S'
THEN 'Small'
WHEN size = 'XL'
THEN 'X-Large'
WHEN size = 'XXL'
THEN '2X-Large'
ELSE size
END AS Variant_Size,
COALESCE(color, Colour) AS Variant_Color
FROM
(
SELECT id,
LEFT(REPLACE(REPLACE(CAST(T2.Loc.query('.') AS VARCHAR(255)), '<X>', ''), '</X>', ''), CHARINDEX(':', REPLACE(REPLACE(CAST(T2.Loc.query('.') AS VARCHAR(255)), '<X>', ''), '</X>', ''))-1) AS header,
REVERSE(LEFT(REVERSE(REPLACE(REPLACE(CAST(T2.Loc.query('.') AS VARCHAR(255)), '<X>', ''), '</X>', '')), CHARINDEX(':', REVERSE(REPLACE(REPLACE(CAST(T2.Loc.query('.') AS VARCHAR(255)), '<X>', ''), '</X>', '')))-2)) AS Value
FROM
(
SELECT ROW_NUMBER() OVER(ORDER BY AttributeDescription) AS id,
CAST(('<X>'+REPLACE(REPLACE(AttributeDescription, '<br />', ','), ',', '</X><X>')+'</X>') AS XML) AS String
FROM #a
) T
CROSS APPLY String.nodes('/X') AS T2(Loc)
) data PIVOT(MAX(value) FOR header IN(Color,
Size,
Model,
Colour)) p;
完整的工作脚本
IF OBJECT_ID('tempdb..#a') IS NOT NULL
DROP TABLE #a;
CREATE TABLE #a(AttributeDescription VARCHAR(255));
INSERT INTO #a
VALUES('Color: black<br />Size: L');
INSERT INTO #a
VALUES('Color: black<br />Size: M');
INSERT INTO #a
VALUES('Color: black<br />Size: S');
INSERT INTO #a
VALUES('Colour: turquoise<br />Size: XXL');
INSERT INTO #a
VALUES('Colour: white<br />Size: M');
INSERT INTO #a
VALUES('Colour: white<br />Size: XL');
INSERT INTO #a
VALUES('Model: iPhone 5/5s');
INSERT INTO #a
VALUES('Model: iPhone 6');
INSERT INTO #a
VALUES('Size: 2X-Large');
INSERT INTO #a
VALUES('Size: Large');
INSERT INTO #a
VALUES('Size: Medium');
INSERT INTO #a
VALUES('Size: Medium / Small');
INSERT INTO #a
VALUES('Size: Small');
INSERT INTO #a
VALUES('Size: XL');
INSERT INTO #a
VALUES('Size: X-Large');
INSERT INTO #a
VALUES('Size: X-Large / Large');
SELECT Model AS Variant_Model,
CASE
WHEN size = 'L'
THEN 'Large'
WHEN size = 'M'
THEN 'Medium'
WHEN size = 'S'
THEN 'Small'
WHEN size = 'XL'
THEN 'X-Large'
WHEN size = 'XXL'
THEN '2X-Large'
ELSE size
END AS Variant_Size,
COALESCE(color, Colour) AS Variant_Color
FROM
(
SELECT id,
LEFT(REPLACE(REPLACE(CAST(T2.Loc.query('.') AS VARCHAR(255)), '<X>', ''), '</X>', ''), CHARINDEX(':', REPLACE(REPLACE(CAST(T2.Loc.query('.') AS VARCHAR(255)), '<X>', ''), '</X>', ''))-1) AS header,
REVERSE(LEFT(REVERSE(REPLACE(REPLACE(CAST(T2.Loc.query('.') AS VARCHAR(255)), '<X>', ''), '</X>', '')), CHARINDEX(':', REVERSE(REPLACE(REPLACE(CAST(T2.Loc.query('.') AS VARCHAR(255)), '<X>', ''), '</X>', '')))-2)) AS Value
FROM
(
SELECT ROW_NUMBER() OVER(ORDER BY AttributeDescription) AS id,
CAST(('<X>'+REPLACE(REPLACE(AttributeDescription, '<br />', ','), ',', '</X><X>')+'</X>') AS XML) AS String
FROM #a
) T
CROSS APPLY String.nodes('/X') AS T2(Loc)
) data PIVOT(MAX(value) FOR header IN(Color,
Size,
Model,
Colour)) p;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.