首页 > 解决方案 > SQL Server:将具有多个值的列中的值拆分为多行

问题描述

我有目前看起来像这样的数据(管道表示单独的列):

ID | Sex | Purchase           | Type  
 1 | M   | Apple, Apple       | Food, Food  
 2 | F   | Pear, Barbie, Soap | Food, Toys, Cleaning  

如您所见,PurchaseType列具有多个以逗号分隔的值(这些列中的某些单元格实际上记录了多达 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”中的第二个单词相关联。我看到的其他问题是多个值只包含在一个列中。

标签: sqlsql-serversql-server-2008

解决方案


基本上,您将需要一个分隔的拆分器功能。周围有很多。我在这里使用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

推荐阅读