【问题标题】:With multiple joins, can rows of one specific column be pivoted into one single row instead of pivoting into columns?使用多个连接,可以将一个特定列的行转为一行而不是转为列吗?
【发布时间】:2019-04-10 17:04:16
【问题描述】:

我无法将行转为一行一列,也无法设置别名列名

我尝试编写连接,然后将其放入选择中,然后旋转该数据集。

select * from (
select DET.*, DETF.ExtractTemplateId, DetF.FieldId, DEF.Field from DataExtractTemplate DET
    join DataExtractTemplateFields DETF
    on DET.Id = DETF.ExtractTemplateId
    join DataExtractFields DEF 
on DETF.FieldId = DEF.Id
    WHERE ClientId = 1) AS Src
PIVOT (
sum(Id)
for FieldId in ([1],[2],[6],[7])
) Pvt

我得到了这个:

Field           1        2       6      7
____________________________________________
First Name      1       NULL    NULL    NULL
Last Name       NULL    1       NULL    NULL
NPI             NULL    NULL    1       NULL
Phone Number    NULL    NULL    NULL    1

但我想要这个

Field1       Field2     Field6  Field7
____________________________________
First Name   Last Name   NPI    Phone Number    

Screenshot of ERD

【问题讨论】:

  • 你能发布你的表结构(创建它的脚本)和示例数据
  • 嗨 Kemal,我添加了 ERD 的屏幕截图。当您说示例数据时,您是指来自每个相关表还是连接?

标签: sql-server


【解决方案1】:

要理解你想要做什么并不容易,但使用交叉表查询似乎可以帮助你。

SELECT SomeGroupingColumns, 
    MAX(CASE WHEN DetF.FieldId = 1 THEN DEF.Field END) AS Field1, 
    MAX(CASE WHEN DetF.FieldId = 2 THEN DEF.Field END) AS Field2, 
    MAX(CASE WHEN DetF.FieldId = 6 THEN DEF.Field END) AS Field6, 
    MAX(CASE WHEN DetF.FieldId = 7 THEN DEF.Field END) AS Field7
FROM DataExtractTemplate DET
JOIN DataExtractTemplateFields DETF ON DET.Id = DETF.ExtractTemplateId
JOIN DataExtractFields         DEF  ON DETF.FieldId = DEF.Id
WHERE ClientId = 1
GROUP BY SomeGroupingColumns;

【讨论】:

  • 这仍然给了我 4 行,但至少数字是实际数据!
  • 成功了!我只需要删除重复的列并将它们从组中删除。谢谢!
  • @JosephPeterson,很高兴您找到了解决方案。请花点时间单击答案左侧的灰色复选标记,将其标记为您接受的答案。它让其他用户知道该问题有答案,并奖励回答的用户一些声望点,你也得到一些。
【解决方案2】:

此代码有效!但是,使用我更新的代码,我得到了空值

SELECT DET.*,
    MAX(CASE WHEN (DetF.FieldId IS NOT NULL AND DETF.FieldID = 1) THEN DETF.FieldId END) AS Field,
    MAX(CASE WHEN DetF.FieldId IS NOT NULL AND DETF.FieldID = 2 THEN DETF.FieldId END) AS Field,
    MAX(CASE WHEN (DetF.FieldId IS NOT NULL AND DETF.FieldID = 3) THEN DETF.FieldId END) AS Field,
    MAX(CASE WHEN DetF.FieldId IS NOT NULL AND DETF.FieldID = 4 THEN DETF.FieldId END) AS Field,
    MAX(CASE WHEN DetF.FieldId IS NOT NULL AND DETF.FieldID = 5 THEN DETF.FieldId END) AS Field,
    MAX(CASE WHEN DetF.FieldId IS NOT NULL AND DETF.FieldID = 6 THEN DETF.FieldId END) AS Field,
    MAX(CASE WHEN DetF.FieldId IS NOT NULL AND DETF.FieldID = 7 THEN DETF.FieldId END) AS Field,
    MAX(CASE WHEN DetF.FieldId IS NOT NULL AND DETF.FieldID = 8 THEN DETF.FieldId END) AS Field

FROM DataExtractTemplate DET
JOIN DataExtractTemplateFields DETF ON DET.Id = DETF.ExtractTemplateId
JOIN DataExtractFields         DEF  ON DETF.FieldId = DEF.Id
WHERE ClientId = 1 and DETF.FieldId IS NOT NULL
GROUP BY DET.Id, DET.ClientId, DET.Name, DET.Description, DET.Delimiter, DET.id, DET.FieldQuotes, DET.ExportFormat, DET.DataSetType,
DET.DeliveryEmail, Det.DeliveryMethod, DET.RecurrenceDayOfYear, DET.RecurrenceDaysOfMonth, DET.RecurrenceEndType, DET.RecurrencePattern, DET.RecurrenceRangeEnd, DET.RecurrenceRangeEndAfter,
DET.RecurrenceRangeStart, Det.RecurrenceWeeks, DET.TimesRecurred, DET.Active;

Row showing nulls

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多