Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 将多行和变量行移动到列_Sql Server - Fatal编程技术网

Sql server 将多行和变量行移动到列

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

尝试将每个用户的多行移动到列。有些用户有不同的行数,例如,2或3封电子邮件,或1加电话号码。这取决于用户帐户

看起来像这样

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函数,但不知道如何将其用于我的数据。这很有帮助。我感谢您的帮助。您可以在我的帖子上做标记,作为对您问题的回答,以表示您的感谢:-