Sql server 将多行和变量行移动到列
尝试将每个用户的多行移动到列。有些用户有不同的行数,例如,2或3封电子邮件,或1加电话号码。这取决于用户帐户 看起来像这样Sql server 将多行和变量行移动到列,sql-server,Sql Server,尝试将每个用户的多行移动到列。有些用户有不同的行数,例如,2或3封电子邮件,或1加电话号码。这取决于用户帐户 看起来像这样 Id FirstName LastName Listing phonetype listingTypeID 1 Judy Johnson judyJ@email.com null 4 1 Judy Johnson 555-555-2020
Id FirstName LastName Listing phonetype listingTypeID
1 Judy Johnson judyJ@email.com null 4
1 Judy Johnson 555-555-2020 home 2
1 Judy Johnson 555-555-2022 home 2
1 Judy Johnson NULL null 1
2 Jim Brown 555-555-3333 cell 2
2 Jim Brown jbrown@email.com null 4
3 John White NULL null 1
3 John White johnwhite@email.com null 4
Id FirstName LastName email email2 email3 phone phone2 phone3
1 Judy Johnson judyJ@email.com 555-555-2020 555-555-2022
2 Jim Brown jbrown@email.com jbrown33@info.com 555-555-3333 555-555-2332
3 John White jwhite@email.com
空值表示地址,我知道该怎么做。我已经在stackflow上多次看到这个示例,但不是每个用户的可变行数。我意识到有些列对于某些用户来说是空的,但我希望得到这样的结果
Id FirstName LastName Listing phonetype listingTypeID
1 Judy Johnson judyJ@email.com null 4
1 Judy Johnson 555-555-2020 home 2
1 Judy Johnson 555-555-2022 home 2
1 Judy Johnson NULL null 1
2 Jim Brown 555-555-3333 cell 2
2 Jim Brown jbrown@email.com null 4
3 John White NULL null 1
3 John White johnwhite@email.com null 4
Id FirstName LastName email email2 email3 phone phone2 phone3
1 Judy Johnson judyJ@email.com 555-555-2020 555-555-2022
2 Jim Brown jbrown@email.com jbrown33@info.com 555-555-3333 555-555-2332
3 John White jwhite@email.com
这就是我所拥有的,它是有效的,但当有多封电子邮件或电话具有相同的类型,即家庭或手机时,就不会创建新的列。我在考虑某种类型的If语句,但无法理解
SELECT id ,
firstname ,
lastname ,
middlename ,
prefix ,
suffix ,
notes ,
MAX(line1) address ,
MAX(line2) address2 ,
MAX(city) city ,
MAX(state) state ,
MAX(zip) zip ,
MAX(county) county ,
MAX(country) country ,
MAX(CASE WHEN phonetype = 'Cell' THEN listing END) Cell ,
MAX(CASE WHEN phonetype = 'Home' THEN listing END) Home ,
MAX(CASE WHEN phonetype = 'Office' THEN listing END) Office ,
MAX(CASE WHEN phonetype = 'Fax' THEN listing END) Fax ,
MAX(CASE WHEN listingTypeID = 4 THEN listing END) email ,
MAX(CASE WHEN listingTypeID = 5 THEN listing END) weblink
FROM [Matrix_Copy].[dbo].[Indiv]
GROUP BY id ,
firstname ,
lastname ,
middlename ,
prefix ,
suffix ,
notes
ORDER BY id
谢谢您的帮助。您可以使用PIVOT来做您想做的事情。诀窍是为每个列表构造一个唯一的键。这可以通过使用ROW_NUMBER来完成,以确保如果用户有多个电话号码,则会将其标识为1、2、3等。。。将此值与ListingTypeId连接以获得[2-1]、[2-2]、[2-3]等,然后基本完成:
SELECT [Id], [Firstname], [Lastname],
[4-1] AS [Email], [4-2] AS [Email2],
[2-1] AS [Phone], [2-2] AS [Phone2], [2-3] AS [Phone3]
FROM (
SELECT *,
CAST(ListingTypeId AS NVARCHAR) + '-' +
CAST(ROW_NUMBER() OVER (PARTITION BY Id, ListingTypeId ORDER BY ListingTypeId) AS NVARCHAR) AS ListingTypeKey
FROM
[Matrix_Copy].[dbo].[Indiv]
) AS SourceTable
PIVOT (
MAX(Listing)
FOR ListingTypeKey IN ([4-1], [4-2], [2-1], [2-2], [2-3])
) AS PivotTable
现在,如果要返回两个以上的电子邮件地址或三个以上的电话号码,只需将它们添加到语句的SELECT部分以及FOR ListingTypeKey in中的列表中即可。电子邮件地址将被编号为[4-1]、[4-2]、[4-3]等,而电话号码将被编号为[2-1]、[2-2]、[2-3]等。不确定这是否是同一件事的可能重复,因为我只需要确定在存在重复时如何创建已知列。谢谢。@user3002720请查看或,您的示例数据中没有phonetype或listingtypeid列。我已多次看到pivot函数,但不知道如何将其用于我的数据。这很有帮助。我感谢您的帮助。您可以在我的帖子上做标记,作为对您问题的回答,以表示您的感谢:-