如何在SQL Server CASE中有多个条件?

时间:2017-02-09 06:44:58

标签: sql sql-server

RefNo   Title
-----   -----
12      Check
12      With Sample
13      Cash
13      With Sample
14      Cash
14      Check
15      Deposit
15      Check

我有这个表,我想在下面输出。

RefNo   Title        Desc
-----   -----        -----
12      Check        With Sample
12      With Sample  With Sample
13      Cash         Hello
13      With Sample  Hello
14      Cash         Cash
14      Check        Cash
15      Deposit      Check
15      Check        Check

基本上在具有相同RefNo的行中,Description具有此优先级:

如果有' With Sample'那么'使用Sample'

如果有'现金'和'使用Sample'那么'你好'

如果有'现金'然后'现金'

如果有'检查'那么'检查'

该描述适用于具有相同RefNo的所有行。谢谢。

4 个答案:

答案 0 :(得分:2)

您需要对每组RefNo行应用窗口化聚合:

WITH cte AS 
 (
   SELECT
       Max(CASE WHEN Title = 'With Sample' THEN 1 ELSE 0 end) Over (PARTITION BY RefNo) AS SampleFlag
      ,Max(CASE WHEN Title = 'Cash'        THEN 1 ELSE 0 end) Over (PARTITION BY RefNo) AS CashFlag
      ,Max(CASE WHEN Title = 'Check'       THEN 1 ELSE 0 end) Over (PARTITION BY RefNo) AS CheckFlag
      ...
   FROM tab
 ) 
SELECT
   CASE
      WHEN SampleFlag + CashFlag = 2 THEN 'Hello'
      WHEN SampleFlag = 1            THEN 'With Sample'
      WHEN CashFlag = 1              THEN 'Cash'
      WHEN CheckFlag = 1             THEN 'Check'
   END
   ...
FROM cte

答案 1 :(得分:0)

也许还有其他方法,但我的如下: -

  1. 使用XML PATH根据ID连接值。
  2. 使用Case切换条件。
  3. 演示: -

    declare @MyTable table (RefNo int ,Title varchar(20) )
    insert into @MyTable values (12 , 'Check')
    insert into @MyTable values (12 , 'With Sample')
    insert into @MyTable values (13 , 'Cash')
    insert into @MyTable values (13 , 'With Sample')
    insert into @MyTable values (14 , 'Cash')
    insert into @MyTable values (14 , 'Check')
    insert into @MyTable values (15 , 'Deposit')
    insert into @MyTable values (15 , 'Check')
    
    select RefNo , Title ,  case  
                                when ( SELECT Title + ',' 
                                        FROM @MyTable p2
                                        WHERE p1.RefNo = p2.RefNo
                                        ORDER BY Title
                                        FOR XML PATH('') ) like '%With Sample%' 
                                        AND
                                        ( SELECT Title + ',' 
                                        FROM @MyTable p2
                                        WHERE p1.RefNo = p2.RefNo
                                        ORDER BY Title
                                        FOR XML PATH('') ) not like '%Cash%' 
                                then 'With Sample'
                                when ( SELECT Title + ',' 
                                        FROM @MyTable p2
                                        WHERE p1.RefNo = p2.RefNo
                                        ORDER BY Title
                                        FOR XML PATH('') ) like  '%Cash,With Sample,%' 
                                then 'Hello'
    
                                when ( SELECT Title + ',' 
                                        FROM @MyTable p2
                                        WHERE p1.RefNo = p2.RefNo
                                        ORDER BY Title
                                        FOR XML PATH('') ) like '%Cash%' 
                                then 'Cash'
                                when ( SELECT Title + ',' 
                                        FROM @MyTable p2
                                        WHERE p1.RefNo = p2.RefNo
                                        ORDER BY Title
                                        FOR XML PATH('') ) like '%Check%' 
                                then 'Check'
                                end [Desc]
    
    from @MyTable  p1
    

    <强>结果: -

    enter image description here

答案 2 :(得分:0)

dnoeth的回答可能是最好的(它只需要修复其条件顺序,正如我评论的那样),但我想到了其他人可能会喜欢的方法:

WITH cte AS
(
    SELECT RefNo, SUM(CASE Title WHEN 'With Sample' THEN 4 WHEN 'Cash' THEN 2 WHEN 'Check' THEN 1 END) Total
    FROM YourTable
    GROUP BY RefNo
)
SELECT YT.RefNo, Title, CASE
    WHEN Total & 6 = 6 THEN 'Hello'
    WHEN Total & 4 = 4 THEN 'With Sample'
    WHEN Total & 2 = 2 THEN 'Cash'
    WHEN Total & 1 = 1 THEN 'Check' END AS "Desc"
FROM YourTable YT
INNER JOIN cte ON YT.RefNo = cte.RefNo

如您所见,我为每个标题分配2个值的幂,然后使用按位运算符来识别每个案例。

答案 3 :(得分:-1)

查询下方将为您提供所需的结果

select t1.RefNo, t1.Title, case
WHEN (t1.Title = 'Check' AND t2.Title = 'With Sample') OR (t2.Title = 'Check' AND t1.Title = 'With Sample') Then 'With Sample'
WHEN (t1.Title = 'Cash' AND t2.Title = 'With Sample') OR (t2.Title = 'Cash' AND t1.Title = 'With Sample') Then 'Hello'
WHEN (t1.Title = 'Cash' AND t2.Title = 'Check') OR (t2.Title = 'Cash' AND t1.Title = 'Check') Then 'Cash'
WHEN (t1.Title = 'Check' AND t2.Title = 'Deposit') OR (t2.Title = 'Check' AND t1.Title = 'Deposit') Then 'Check'
END
 from TestCase t1 cross join TestCase t2 where t1.Title != t2.Title and t1.RefNo = t2.RefNo