首页 > 解决方案 > 将数据合并到每条记录的一行 - 可能的 PIVOT

问题描述

我有一些数据正在尝试从旧系统中组织。它在数据库中的单独行上列出了我们的电子邮件和号码。

CREATE TABLE #temptable ( [LookupCode] char(10), [Title] varchar(20), [FirstName] varchar(30), [MiddleName] varchar(16), [LastName] varchar(30), [Number] varchar(150), [EmailWeb] varchar(150), [TypeCode] char(3), [Primary] int )
INSERT INTO #temptable ([LookupCode], [Title], [FirstName], [MiddleName], [LastName], [Number], [EmailWeb], [TypeCode], [Primary])
VALUES
( 'ANDERSSO01', 'Miss', 'Jessie', '', 'Bloggs', '', 'abc@gmail.com', 'EM1', 1 ), 
( 'ANDERSSO01', 'Mr', 'Joe', '', 'Bloggs', '01363936541', '', 'RES', 0 ), 
( 'ANDERSSO01', 'Mr', 'Joe', '', 'Bloggs', '', 'xyz@gmail.com', 'EM1', 0 ), 
( 'ANDERSSO01', 'Miss', 'Jessie', '', 'Bloggs', '073321663', '', 'RES', 1 )

SELECT * FROM #temptable t

DROP TABLE #temptable

这基本上返回数据,如以下 SQL Fiddle 所示:

http://sqlfiddle.com/#!18/b475b/1

在此处输入图像描述

我已经设法通过最初进行子查询来获得结果 - 但是对于这个示例,这些都失败了,因为同一个 LookupCode 有多个联系人,子查询仅适用于一条记录。

最终应该只有两行 - 一行给 Jessie,另一行给 Joe,号码和电子邮件都在同一行。

WHERE TypeCode = 'EM1'

用于电子邮件,RES 用于家庭电话 - 我已将 ACT TypeCode 删除,因为它是错误的。

我已尝试使用 PIVOT 但结果好坏参半,我将不胜感激 - UNPIVOT 不适用于数据已经是 UNPIVOT 格式,基本上基于过滤的 TypeCode。

**更新 - 枢轴示例**

WITH
    cte
AS  (
        SELECT
                c.LookupCode
            , cn.LkPrefix 'Title'
            , cn.FirstName
            , cn.MiddleName
            , cn.LastName
              , CAST(cn2.Number AS VARCHAR(150)) 'Number'
              , CAST(cn2.EmailWeb AS VARCHAR(150)) 'EmailWeb'
              , cn2.TypeCode
              , cn2.TypeCode 'TypeCode2'
              , c.UniqEntity
              , cn2.UniqContactName
              , IIF(c.UniqContactNamePrimary = cn2.UniqContactName, 1, 0) "Primary"
        FROM
                dbo.Client        c
            LEFT OUTER JOIN
                dbo.ContactNumber cn2           
                    ON cn2.UniqEntity = c.UniqEntity --AND cn2.UniqContactName = c.UniqContactNamePrimary
            LEFT OUTER JOIN dbo.ContactName cn ON c.UniqEntity = cn.UniqEntity AND cn2.UniqContactName = cn.UniqContactName
        WHERE
                c.LookupCode = @LookupCode
    )
    select RES 'Home', MOB 'Mobile',  EM1 'Email', [Primary], FirstName, LastName
from
(
  select *
  from cte
) d
pivot
(
  max(Number)
  for TypeCode in (RES, MOB)
) piv
pivot
(
  max(EmailWeb)
  for TypeCode2 in (EM1)
) piv2

结果

在此处输入图像描述

标签: sqlsql-server

解决方案


我个人会在这里使用条件聚合。您没有解释要对TypeCodeandPrimary值做什么,因此我省略了它们,但是,如果您确实希望在查询中使用它们,则需要以某种方式汇总它们,而不是添加到GROUP BY(将它们添加到GROUP BY遗嘱中导致多行):

SELECT t.LookupCode,
       t.Title,
       t.FirstName,
       t.LastName,
       MAX(t.Number) AS Number,
       MAX(t.EmailWeb) AS EmailWeb
FROM #temptable t
GROUP BY t.LookupCode,
         t.Title,
         t.FirstName,
         t.LastName;

推荐阅读