来自 JOIN 表的 PIVOT

Posted

技术标签:

【中文标题】来自 JOIN 表的 PIVOT【英文标题】:PIVOT from JOIN tables 【发布时间】:2017-03-30 02:08:43 【问题描述】:

我有一个大型数据库,在这个数据库中,我需要从两个表中提取信息。通过使用 JOIN 和 CASE WHEN,我已经从两个表中提取了我需要的所有数据。这是输出的屏幕截图

SQL Server output

这是我用来拉数据的代码:

SELECT [PORTMultiMax].[dbo].cardholdertable.cardid as CardID,CardHolderTable.FirstName as FirstName,CardHolderTable.LastName as LastName, CardHolderTable.InitLet as MI, CardHolderPersonalDataXrTable.PersonalDataItem as Data,
  CASE WHEN PersonalDataID = '4' THEN 'SSN'
         WHEN PersonalDataID = '22' THEN 'Employer'
         WHEN PersonalDataID = '30' THEN 'Training Type'
         WHEN PersonalDataID = '32' THEN 'Primary Sponsor'
         WHEN PersonalDataID = '37' THEN 'Training Date'
         ELSE NULL END AS Description
  FROM [PORTMultiMax].[dbo].[CardHolderTable]
  join [PORTMultiMax].[dbo].[CardHolderPersonalDataXrTable]
  on cardholdertable.CardID=CardHolderPersonalDataXrTable.CardID
    where PersonalDataID IN (4,22,30,32,33,37)
    order by LastName

涉及的表命名为:CardHolderTable 和 CardHolderPersonalDataXrTable 接下来我需要做的是摆脱数据中的重复名称条目。例如,“JAMES AARON”有多个行,因为他有多个描述符(“Training Date、TrainingType、Employer 和 SSN”)。

我想尝试使用 PIVOT 来提取行数据并将它们放入名为“SSN、雇主等...”的列中。我的问题是我以前从未使用过 PIVOT,我对如何将 PIVOT 代码应用于我当前的 SQL 查询感到困惑。

请帮忙。非常感谢

【问题讨论】:

编辑您的问题并提供示例数据和所需结果。或者就该信息提出另一个问题。 【参考方案1】:

鉴于您的查询,我认为条件聚合更简单:

SELECT ch.FirstName, ch.LastName
       MAX(CASE WHEN PersonalDataID = '4' THEN 1 ELSE 0 END) as is_SSN
       MAX(CASE WHEN PersonalDataID = '22' THEN ELSE 0 END) as is_Employer,
       MAX(CASE WHEN PersonalDataID = '30' THEN ELSE 0 END) as is_TrainingType,
       MAX(CASE WHEN PersonalDataID = '32' THEN ELSE 0 END) as is_PrimarySponsor,
       MAX(CASE WHEN PersonalDataID = '37' THEN ELSE 0 END) as is_TrainingDate
from [PORTMultiMax].[dbo].[CardHolderTable] ch join
     [PORTMultiMax].[dbo].[CardHolderPersonalDataXrTable] cp
     on ch.CardID = cp.CardID
where PersonalDataID IN (4, 22, 30, 32, 33, 37)
group by ch.FirstName, ch.LastName;

【讨论】:

这肯定让我更接近,但我需要将个人数据项列中的数据放在新创建的列下。如果此人的名字是 John Smith,并且他有 SSN、雇主和培训类型,那么结果将是:John Smith 123-45-6789 Disney World Badge Disney World 01/01/2015

以上是关于来自 JOIN 表的 PIVOT的主要内容,如果未能解决你的问题,请参考以下文章

C# SqlDataAdapter 与来自多个数据库的表的 JOIN

C# SqlDataAdapter 与来自多个数据库的表的 JOIN

来自同一个表的多个 INNER JOIN

来自三个表的 JOIN 和 GROUP_CONCAT 的意外结果

来自第二个表的 MySQL INNER JOIN (TOP10)

[15]SQL 连接(JOIN)