【问题标题】:INNER JOIN using a CASE statements使用 CASE 语句的 INNER JOIN
【发布时间】:2017-03-08 15:18:16
【问题描述】:

我正在尝试加入两个表并使用 CASE 语句,但是我没有得到我想要的结果。

这是我现有的代码:

 SELECT i.[ProviderID], l.FacilityName, 
        CASE WHEN [StepID] = 1 THEN 'Step0.5' END AS 'Step0.5', 
        CASE WHEN [StepID] = 2 THEN 'StepI' END AS 'StepI',
        CASE WHEN [StepID] = 4 THEN 'StepI.D' END AS 'StepI.D',
        CASE WHEN [StepID] = 5 THEN 'StepII.1' END AS 'StepII.1',
        CASE WHEN [StepID] = 6 THEN 'StepII.5' END AS 'StepII.5',
        CASE WHEN [StepID] = 7 THEN 'StepII.D' END AS 'StepII.D',
        CASE WHEN [StepID] = 8 THEN 'StepIII.1' END AS 'StepIII.1'  
   FROM RD.dbo.vwProvider as l 
   INNER JOIN [RD].[dbo].[vwSteps] i 
     ON l.ProviderID = i.ProviderID 
   Group by i.[ProviderID], l.FacilityName, [StepID] 
   ORDER BY FacilityName

这是我目前的结果:

ProviderID  FacilityName Step0.5  StepI StepI.D StepII.1    StepII.5 StepII.D   StepIII.1

4           This Is Us   Step0.5  NULL   NULL     NULL      NULL      NULL      NULL
4           This Is Us   NULL     NULL   StepI.D  NULL      NULL      NULL      NULL
6           Almost       NULL     NULL   NULL     StepII.1  NULL      NULL      NULL
6           Almost       NULL     NULL   NULL     NULL      NULL      StepII.D  NULL
6           Almost       NULL     StepI  NULL     NULL      NULL      NULL      NULL

这是我正在寻找的结果:

ProviderID  FacilityName Step0.5  StepI  StepI.D   StepII.1 StepII.5  StepII.D  StepIII.1

4           This Is Us   Step0.5  NULL   StepI.D  NULL      NULL      NULL      NULL
6           Almost       NULL     StepI  NULL     StepII.1  NULL      StepII.D  NULL

【问题讨论】:

  • 请标记您的 dbms。

标签: sql join left-join case inner-join


【解决方案1】:

需要将StepIdGROUP BY中去掉,并引入聚合函数:

 SELECT i.[ProviderID], l.FacilityName, 
        MAX(CASE WHEN [StepID] = 1 THEN 'Step0.5') END AS 'Step0.5', 
        MAX(CASE WHEN [StepID] = 2 THEN 'StepI' END) AS 'StepI',
        MAX(CASE WHEN [StepID] = 4 THEN 'StepI.D' END) AS 'StepI.D',
        MAX(CASE WHEN [StepID] = 5 THEN 'StepII.1' END) AS 'StepII.1',
        MAX(CASE WHEN [StepID] = 6 THEN 'StepII.5' END) AS 'StepII.5',
        MAX(CASE WHEN [StepID] = 7 THEN 'StepII.D' END) AS 'StepII.D',
        MAX(CASE WHEN [StepID] = 8 THEN 'StepIII.1' END) AS 'StepIII.1'  
   FROM RD.dbo.vwProvider  l INNER JOIN
        [RD].[dbo].[vwSteps] i 
        ON l.ProviderID = i.ProviderID 
   Group by i.[ProviderID], l.FacilityName
   ORDER BY FacilityName

【讨论】:

    【解决方案2】:

    使用MAX()MIN() 聚合,在GROUP BY 中似乎不需要StepID

    SELECT i.[ProviderID], l.FacilityName, 
            max(CASE WHEN [StepID] = 1 THEN 'Step0.5'   END) AS 'Step0.5', 
            max(CASE WHEN [StepID] = 2 THEN 'StepI'     END) AS 'StepI',
            max(CASE WHEN [StepID] = 4 THEN 'StepI.D'   END) AS 'StepI.D',
            max(CASE WHEN [StepID] = 5 THEN 'StepII.1'  END) AS 'StepII.1',
            max(CASE WHEN [StepID] = 6 THEN 'StepII.5'  END) AS 'StepII.5',
            max(CASE WHEN [StepID] = 7 THEN 'StepII.D'  END) AS 'StepII.D',
            max(CASE WHEN [StepID] = 8 THEN 'StepIII.1' END) AS 'StepIII.1'  
       FROM RD.dbo.vwProvider as l INNER JOIN [RD].[dbo].[vwSteps] i ON l.ProviderID = i.ProviderID 
          Group by i.[ProviderID], l.FacilityName
          ORDER BY FacilityName
    

    【讨论】:

    • Step0.5 有多个匹配项时会发生什么?
    • @Raj More 如果Step0.5有多个匹配,则会聚合在一行中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-23
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    • 1970-01-01
    相关资源
    最近更新 更多