[英]SQL Extracting Data from Column
Looking for some SQL help selecting particular data from a column in my table, and creating new columns with that. 寻找一些SQL帮助来从表中的列中选择特定数据,并以此创建新列。 Here's a sample of the data in the
AttributeDescription
column: 这是
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`
I would like to turn this into three columns named "Variant_Model", "Variant_Size" and "Variant_Color". 我想将其分为三个列,分别为“ Variant_Model”,“ Variant_Size”和“ Variant_Color”。 End result should be like:
最终结果应为:
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| `
Note that in the original column, the attribute could appear as either "Color" or "Colour". 请注意,在原始列中,该属性可能显示为“颜色”或“颜色”。
Bonus points for standardizing the abbreviated sizes (eg. "L", "M") into the appropriate words! 标准化缩写词(例如“ L”,“ M”)成适当单词的加分!
Thanks very much in advance! 首先十分感谢!
One Way to do it is like this 一种方法是这样的
Query: 查询:
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;
Complete Working Script 完整的工作脚本
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.