如何将 2 SQL CASE 语句合并为单列输出

How to merge 2 SQL CASE statements for output in a single column

我正在使用 SQL Server 2014,我有一个查询,我需要合并 2 个 CASE 语句以在一个名为 'Market Final'.

的列中输出

案例陈述1如下:

(CASE e.TravelAgencyTypeCode WHEN 'DMC' THEN g2.CountryGroup ELSE g.CountryGroup END) AS 'Market Final'

当我 运行 使用上面的 CASE 语句进行查询时,它 运行 没问题,我得到了我想要的东西。当我需要添加第二个也会影响 "Market Final" 列的 CASE 语句时,它对我来说有点复杂。

CASE语句2如下:

(CASE c.TAProfileID WHEN c.TAProfileID = '316' and c.CurrencyCode = 'MUR' THEN g.CountryGroup = 'DB Local' ELSE g.CountryGroup = 'DB International' END)

我读到这可以通过 UNION ALL 语句完成,但我不知道如何处理它。我也感觉我的CASE Statement 2写错了。

感谢您的帮助!

编辑:这是我的完整 SQL 查询,以便您了解全貌:

USE  MyDatabase

SELECT 

  b.PropertyCode,
  c.PMSConfirmationNumber,   
  a.FirstName + ' ' + a.LastName AS 'Name',
  b.ReservationStatus AS 'Status',
  d.rsl_nationality AS 'Nationality',
  d.rsl_rateplan AS 'Rate Plan Code',
  d.rsl_roomtype AS 'Room Type',
  i.RoomType2 AS 'Room Type 2', 
  b.GuestCount AS 'Total Guest', 
  c.CurrencyCode,
  e.TravelAgencyTypeCode AS 'Source of Business',
  c.TAProfileID,
  e.Name AS 'Tour Operator', 
  g.CountryGroup AS 'Market', 
  c.TAProfileID2, 
  e2.Name AS 'Booking Origin (1)', 
  g2.CountryGroup AS 'Booking Origin (2)',

  (CASE e.TravelAgencyTypeCode WHEN 'DMC' THEN g2.CountryGroup ELSE  g.CountryGroup END) AS 'Market Final'

 FROM GuestNameInfo a
 JOIN GuestStaySummary b ON a.ReservationStayID = b.ReservationStayID
 LEFT JOIN ReservationStay c ON c.ReservationStayID = b.ReservationStayID
 LEFT JOIN P5RESERVATIONLIST d ON d.rsl_code = b.ReservationStayID 
 LEFT JOIN TravelAgency e ON e.TravelAgencyID = c.TAProfileID 
 LEFT JOIN Market g ON e.CountryCode = g.CountryCode 
 LEFT JOIN TravelAgency e2 ON e2.TravelAgencyID = c.TAProfileID2
 LEFT JOIN Market g2 ON e2.CountryCode = g2.CountryCode 
 LEFT JOIN Exrate h ON h.Ccode = c.CurrencyCode
 LEFT JOIN RoomCat i ON b.PropertyCode = i.Property AND d.rsl_roomtype = i.RoomType 

所以现在我需要将 CASE 2 语句 2 添加到此查询中,以便更改反映在“市场最终”列中。

这是我想要的输出:

PropertyCode....CurrencyCode SourceofBusiness TAProfileID.... Market .... Booking Origin (2)  MarketFinal
    A            MUR          DMC                 50           Other Mkt      Scandinavia       Scandinavia
    A            USD          TO                  75             UK             UK                UK
    B            USD          DIR                 316             DB             USA               DB International
    B            MUR          DIR                 316            DB             MTS               DB Local

你可以通过这样的方式来完成

CASE 
WHEN [condition1] THEN [Expression] 
WHEN [condition2] THEN [Expression]
WHEN [condition3] THEN [Expression]
WHEN [condition4] THEN [Expression]
ELSE [Expression]
END

所以在你的情况下会是这样的

(CASE WHEN e.TravelAgencyTypeCode = 'DMC' 
 THEN g2.CountryGroup 
 WHEN e.TravelAgencyTypeCode != 'DMC'
 THEN g.CountryGroup
 WHEN c.TAProfileID = '316' AND c.CurrencyCode = 'MUR'
 THEN 'DB Local' ELSE 'DB International') AS 'Market Final'

根据您提供的示例和其他信息,您似乎需要以下逻辑:

  • 如果e.TravelAgencyTypeCode = 'DMC',则return g2.CountryGroup

  • 否则:

    • 如果c.TAProfileID = '316',则:

      • 如果c.CurrencyCode = 'MUR',则return 'DB Local'

      • 否则return'DB International'

    • 否则returng.CountryGroup

您可以使用简单的 CASE 语法或多或少地使用嵌套 CASE 来实现此逻辑:

CASE e.TravelAgencyTypeCode
  WHEN 'DMC' THEN g2.CountryGroup
  ELSE
    CASE c.TAProfileID
      WHEN '316' THEN
        CASE c.CurrencyCode
          WHEN 'MUR' THEN 'DB Local'
          ELSE 'DB International'
        END
      ELSE g.CountryGroup
    END
END

或搜索的 CASE 语法:

CASE
  WHEN e.TravelAgencyTypeCode = 'DMC' THEN g2.CountryGroup
  ELSE
    CASE
      WHEN c.TAProfileID = '316' THEN
        CASE
          WHEN c.CurrencyCode = 'MUR' THEN 'DB Local'
          ELSE 'DB International'
        END
      ELSE g.CountryGroup
    END
END

但是,嵌套的 CASE 可能不太可读 - 特别是当您没有很多子案例时,就像在这种情况下一样。所以,如果我是你,我实际上可能会以这种方式展平上述结构:

CASE
  WHEN e.TravelAgencyTypeCode = 'DMC' THEN g2.CountryGroup
  WHEN c.TAProfileID = '316' AND c.CurrencyCode = 'MUR' THEN 'DB Local'
  WHEN c.TAProfileID = '316' THEN 'DB International'
  ELSE g.CountryGroup
END

第三个WHEN也可以写成

  WHEN c.TAProfileID = '316' AND c.CurrencyCode <> 'MUR' THEN 'DB International'

AND c.CurrencyCode <> 'MUR' 是不必要的:在评估点 c.CurrencyCode 无论如何都不会等于 'MUR'。这是因为一旦找到匹配的条件,CASE 的评估就会停止,如果达到裸 c.TAProfileID = '316' 时没有找到匹配,则意味着前面的条件失败,因此 c.CurrencyCode 肯定是什么否则。