sql - 将数据合并到每条记录的一行 - 可能的 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
结果
解决方案
我个人会在这里使用条件聚合。您没有解释要对TypeCode
andPrimary
值做什么,因此我省略了它们,但是,如果您确实希望在查询中使用它们,则需要以某种方式汇总它们,而不是添加到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;
推荐阅读
- python-3.x - Python:如何在不转义内引号的情况下加入包含引号的字符串列表?
- android - 插件 Android Studio java.lang.NoClassDefFoundError 中的异常:com/sun/java/swing/plaf/windows/WindowsComboBoxUI
- android - Android按钮点击事件的Kotlin协程流程示例?
- javascript - 在不滚动的元素上使用 onscroll
- selenium - 如何在包含标签内设置功能文件的优先级
- angular - Angular 的可重用组件
- anaconda - SIFT、SURF 等特征描述符不适用于基本的 python 3.7 和 anaconda python 3.6.5
- javascript - jQuery .text() 没有显示表情符号
- spring-integration - 如何在将文件发送到 sftp 出站适配器之前检查文件计数
- aws-lambda - 来自网络浏览器的 Alexa 技能(内在功能)