【问题标题】:getting rid of NULL rows when transforming a row into a column将行转换为列时摆脱 NULL 行
【发布时间】:2019-12-10 10:43:09
【问题描述】:

我有以下 SQL 代码:

SELECT TOP (1000) 
  a.[JourneyNumber]
  ,a.[JourneyDate]
  ,a.[tReg_ID]
  ,a.[Reg]
  ,a.[ID]
  ,b.tLocationPosition_ID
  ,c.LifeCode
  ,c.LifeTotal

  ,CASE WHEN c.LifeCode LIKE 'LCF1' AND b.tLocationPosition_ID = 1 THEN c.LifeTotal END as ALCF1
  ,CASE WHEN c.LifeCode LIKE 'LCF1' AND b.tLocationPosition_ID = 2 THEN c.LifeTotal END as BLCF1
FROM [RALNHVTST].[dbo].[tRegJourney] as a

LEFT JOIN [RALNHVTST].[dbo].[tRegJourneyLogBook] as b
ON a.ID = b.tRegJourney_ID

LEFT JOIN [RALNHVTST].[dbo].[tRegJourneyLogBookLifeCodeEvents] AS c
ON b.ID = c.tRegJourneyLogBook_ID

WHERE b.tLocation_ID = 720
AND a.tReg_ID = 73 OR a.tReg_ID = 38
AND (b.tLocationPosition_ID = 1 OR b.tLocationPosition_ID = 2)
AND (c.LifeCode LIKE 'LCF1' )
ORDER BY JourneyDate    

在 SELECt 语句中,我试图将主要包含相同信息的多行转换为列。

这样:

JourneyNo JourneyDate       Reg    ID   tLocationPos_ID LifeCodeLifeTotal
4A  2015-08-31 00:00:00.000 OO-NSN  45023   1   LCF1    68.0000
4A  2015-08-31 00:00:00.000 OO-NSN  45023   2   LCF1    67.0000

变成这样:

JourneyNumber   JourneyDate Reg      ID LifeCode    ALCF1   BLCF1
4A  2015-08-31 00:00:00.000 OO-NSN  45023   LCF1    68.0000 67.000

但我却得到了这个:

JourneyNumber   JourneyDate    Reg       ID     LifeCode        ALCF1   BLCF1
4A  2015-08-31 00:00:00.000      OO-NSN 45023      LCF1         68.0000 NULL
4A  2015-08-31 00:00:00.000      OO-NSN 45023      LCF1         NULL    67.0000

谁能帮我解决这个问题?

谢谢!

【问题讨论】:

    标签: sql null row calculated-columns case-when


    【解决方案1】:

    修正您的查询,使表别名有意义!

    我也怀疑您的 WHERE 子句是否真的在做您想要的。在下面的查询中,我稍微更改了条件,因此第二个表上的条件适用于结果中的所有行。

    为了性能,我推荐CROSS APPLY:

    SELECT TOP (1000) rj.[JourneyNumber], rj.[JourneyDate]
           rj.[tReg_ID], rj.[Reg], rj.[ID]
           rjlb.tLocationPosition_ID,
    .LifeCode,
           ce.ALCF1, ce.BLCF1
    FROM [RALNHVTST].[dbo].[tRegJourney] rj
          CROSS APPLY
         (SELECT SUM(CASE WHEN rjlb.tLocationPosition_ID = 1 THEN ce.LifeTotal END) as ALCF1,
                 SUM(CASE WHEN rjlb.tLocationPosition_ID = 2 THEN ce.LifeTotal END) as BLCF1
          FROM [RALNHVTST].[dbo].[tRegJourneyLogBook] rjlb
               [RALNHVTST].[dbo]. tRegJourneyLogBookLifeCodeEvents ce
               ON rjlb.ID = ce.tRegJourneyLogBook_ID AND
          WHERE rj.ID = rjlb.tRegJourney_ID AND
                rjlb.tLocationPosition_ID IN (1, 2) AND
                rjlb.tLocation_ID = 720 AND
                ce.LifeCode LIKE 'LCF1'
         ) ce
    WHERE rj.tReg_ID IN (73, 38 
    ORDER BY JourneyDate ;
    

    【讨论】:

      【解决方案2】:

      使用聚合

      SELECT TOP (1000) 
        a.[JourneyNumber]
        ,a.[JourneyDate]
        ,a.[tReg_ID]
        ,a.[Reg]
        ,a.[ID]
        ,b.tLocationPosition_ID
        ,c.LifeCode
        ,c.LifeTotal
      
        ,max(CASE WHEN c.LifeCode LIKE 'LCF1' AND b.tLocationPosition_ID = 1 THEN c.LifeTotal END) as ALCF1
        ,max(CASE WHEN c.LifeCode LIKE 'LCF1' AND b.tLocationPosition_ID = 2 THEN c.LifeTotal END) as BLCF1
      FROM [RALNHVTST].[dbo].[tRegJourney] as a
      
      LEFT JOIN [RALNHVTST].[dbo].[tRegJourneyLogBook] as b
      ON a.ID = b.tRegJourney_ID
      
      LEFT JOIN [RALNHVTST].[dbo].[tRegJourneyLogBookLifeCodeEvents] AS c
      ON b.ID = c.tRegJourneyLogBook_ID
      
      WHERE b.tLocation_ID = 720
      AND a.tReg_ID = 73 OR a.tReg_ID = 38
      AND (b.tLocationPosition_ID = 1 OR b.tLocationPosition_ID = 2)
      AND (c.LifeCode LIKE 'LCF1' )
      group by  a.[JourneyNumber]
        ,a.[JourneyDate]
        ,a.[tReg_ID]
        ,a.[Reg]
        ,a.[ID]
        ,b.tLocationPosition_ID
        ,c.LifeCode
        ,c.LifeTotal
      ORDER BY JourneyDate    
      

      【讨论】:

      • 这是我考虑的第一件事,但由于我使用 b.tLocationPosition_ID 来定义我的列,所以它不是一个选项。您发布的解决方案给我的结果与没有 GROUP BY 的结果完全相同。
      • @CathalClavie 你能提供dbfiddle.uk 表中的数据吗
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-30
      • 2014-12-04
      相关资源
      最近更新 更多