如何将 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
肯定是什么否则。
我正在使用 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'
,则returng2.CountryGroup
否则:
如果
c.TAProfileID = '316'
,则:如果
c.CurrencyCode = 'MUR'
,则return'DB Local'
否则return
'DB International'
否则return
g.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
肯定是什么否则。