sql - SQL Server:将具有多个值的列中的值拆分为多行
问题描述
我有目前看起来像这样的数据(管道表示单独的列):
ID | Sex | Purchase | Type
1 | M | Apple, Apple | Food, Food
2 | F | Pear, Barbie, Soap | Food, Toys, Cleaning
如您所见,Purchase
和Type
列具有多个以逗号分隔的值(这些列中的某些单元格实际上记录了多达 50 多个值)。我希望数据看起来像这样:
ID | Sex | Purchase | Type
1 | M | Apple | Food
1 | M | Apple | Food
2 | F | Pear | Food
2 | F | Barbie | Toys
2 | F | Soap | Cleaning
关于如何使用 SQL 做到这一点的任何想法?谢谢大家的帮助。
编辑:只是为了表明这与其他一些问题不同。这里的关键是每个唯一行的数据包含在两个单独的列中,即“Purchase”中的第二个单词应该与 ID #1 的“Type”中的第二个单词相关联。我看到的其他问题是多个值只包含在一个列中。
解决方案
基本上,您将需要一个分隔的拆分器功能。周围有很多。我在这里使用DelimitedSplit8K
来自 Jeff Moden http://www.sqlservercentral.com/articles/Tally+Table/72993/
-- create the sample table
create table #sample
(
ID int,
Sex char,
Purchase varchar(20),
Type varchar(20)
)
-- insert the sample data
insert into #sample (ID, Sex, Purchase, Type) select 1, 'M', 'Apple,Apple', 'Food,Food'
insert into #sample (ID, Sex, Purchase, Type) select 2, 'M', 'Pear,Barbie,Soap', 'Food,Toys,Cleaning'
select s.ID, s.Sex, Purchase = p.Item, Type = t.Item
from #sample s
cross apply DelimitedSplit8K(Purchase, ',') p
cross apply DelimitedSplit8K(Type, ',') t
where p.ItemNumber = t.ItemNumber
drop table #sample
推荐阅读
- html - 如何让我的内容可以滚动,同时保持我的页眉和页脚在同一个地方
- elasticsearch - 弹性搜索快照恢复另一个集群
- swift - 是否可以将文件从 Swift 应用程序发送到 Firebase 中的可调用函数?
- sql-server - 如何将mssql表中的日期和时间分成两列
- javascript - jQuery load() 函数 - 无法从动态加载的标题内容中获取高度
- android - Android Studio Gradle - 无法解决依赖关系
- sql-server - 转换为字符串时更改默认日期时间格式
- oop - 为什么像 Java、VB.NET 和 C# 这样的现代面向对象语言不支持多重继承
- reporting - 从 Microsoft Application Insights 数据生成报告
- groovy - Groovy encodeBase64() 返回 PNG 图像文件的意外结果