SQL CASE逻辑问题

时间:2015-02-03 20:00:01

标签: sql sql-server-2012

有人可以帮助我吗?示例:我遇到的问题是帐户有AV.Query =' PN4',AV.Response =' Y',AV.Query =' FL1'和AV.Response =' Y',结果需要

PStatus   IStatus
4         2

然而,我正在

PStatus    IStatus
4          5
5          2

它选择" 5"所有的时间都在对面的栏目上。

SELECT distinct  A.AcctNum,
      CASE 
        WHEN O.Order = 'NEI2' THEN '1'
        WHEN AV.Query IN ('PNE1','PNE2') AND AV.Response = 'Y' THEN '2'
        WHEN AV.Query = 'PN20' AND AV.Response = 'Y' THEN '3'
        WHEN AV.Query = 'PN4' AND AV.Response = 'Y' THEN '4'
      ELSE '5'
         END AS [PStatus],

    CASE   
        WHEN O.Order IN ('DO2','FL25','VACHP') THEN '1'
        WHEN AV.Query = 'FL1' AND AV.Response = 'Y' THEN '2'
            WHEN AV.Query = 'REF' AND AV.Response = 'Y' THEN '3'
        WHEN AV.Query IN ('FL2','FL6','NEU.G','HE.B') AND AV.Response = 'Y' THEN '4'
        WHEN AV.Query = 'NOA' AND AV.Response = 'Y' THEN '6'
    ELSE '5'
    END AS [IStatus]

FROM AData AS AD 

        INNER JOIN AVisit AS AV
         ON AD.Visit = AV.Visit
      AND AV.QueryID IN ('PNE1','PNE2','PN20','PN4','FL1','REF','FL2','FL6','NEU.G','HE.B','NOA')

        LEFT JOIN Order AS O
     ON AD.Visit = O.Visit
         AND O.Order IN ('NEI2','DO2','FL25','VACHP');

2 个答案:

答案 0 :(得分:3)

您的搜索结果似乎正确。

首先考虑具有

的联接行
  

AV.Query ='PN4',AV.Response ='Y',

这符合WHEN的{​​{1}}表达式中的最后一个CASE条件,但它与[PStatus]表达式中的任何WHEN条件都不匹配为CASE。结果:

[IStatus]

现在考虑具有

的连接行
  

AV.Query ='FL1'和AV.Response ='Y'

这与4 5 的{​​{1}}表达式中的任何WHEN条件都不匹配,但它与CASE表达式中的[PStatus]条件匹配{ {1}}。结果:

WHEN

我可以给你一个关于你的查询的变体,它会产生你为你呈现的特定数据指定的结果,但是我不这样做,因为有很多选择,你还没有给我们提供信息来确定哪一个正确回答了其他数据的问题。

<强>更新

要将多个结果行合并为一个,您需要一个聚合查询。实现此类查询以提供具有给定数据值4的单行的一种可能方法是

CASE

这是有效的,因为[IStatus]以外的聚合函数会忽略5 2 。但是,很可能无法为不同的数据模式提供所需的答案 - 尤其是同一帐户中存在两个以上SELECT AcctNum, MIN( CASE WHEN O.Order = 'NEI2' THEN '1' WHEN AV.Query IN ('PNE1','PNE2') AND AV.Response = 'Y' THEN '2' WHEN AV.Query = 'PN20' AND AV.Response = 'Y' THEN '3' WHEN AV.Query = 'PN4' AND AV.Response = 'Y' THEN '4' ELSE NULL END ) AS [Pstatus], MIN( CASE WHEN O.Order IN ('DO2','FL25','VACHP') THEN '1' WHEN AV.Query = 'FL1' AND AV.Response = 'Y' THEN '2' WHEN AV.Query = 'REF' AND AV.Response = 'Y' THEN '3' WHEN AV.Query IN ('FL2','FL6','NEU.G','HE.B') AND AV.Response = 'Y' THEN '4' WHEN AV.Query = 'NOA' AND AV.Response = 'Y' THEN '6' ELSE NULL END ) AS [IStatus] FROM AData AS AD INNER JOIN AVisit AS AV ON AD.Visit = AV.Visit AND AV.QueryID IN ('PNE1','PNE2','PN20','PN4','FL1','REF','FL2','FL6','NEU.G','HE.B','NOA') LEFT JOIN Order AS O ON AD.Visit = O.Visit AND O.Order IN ('NEI2','DO2','FL25','VACHP'); GROUP BY AcctNum s的模式。

答案 1 :(得分:1)

结果是正确的。

您的价值观是:

第一行 - AV.Query='PN4'AV.Response = 'Y' 第二行 - AV.Query='FL1', AV.Response='Y'

第一个案例PStatus:结果是你预期的4个。

下一个案例,Istatus。这可能是谎言的误解,因为SQL将处理相同的值(第一行)。此CASE将检查第一行的值AV.Query='PN4'AV.Response = 'Y'。不符合您的第二个值(AV.Query='FL1' and AV.Response='Y')。

'PN4' and 'FL1'不能位于同一行的同一列中!一列只能有一个值,而不是两个。您可能期望在第二种情况下SQL将开始获取另一(第二)行数据。但事实并非如此。

第二种情况结果是正确的因为在CASE中没有值PN4的条件,所以它最终为ELSE = 5


确定编辑,这样做,这个蛮力,但会起作用; - )

   SELECT A.AcctNum,
     COALESCE(MAX( CASE 
        WHEN O.Order = 'NEI2' THEN '1'
        WHEN AV.Query IN ('PNE1','PNE2') AND AV.Response = 'Y' THEN '2'
        WHEN AV.Query = 'PN20' AND AV.Response = 'Y' THEN '3'
        WHEN AV.Query = 'PN4' AND AV.Response = 'Y' THEN '4'
      ELSE NULL
         END),5) AS [PStatus],

    COALESCE(MAX(CASE   
        WHEN O.Order IN ('DO2','FL25','VACHP') THEN '1'
        WHEN AV.Query = 'FL1' AND AV.Response = 'Y' THEN '2'
        WHEN AV.Query = 'REF' AND AV.Response = 'Y' THEN '3'
        WHEN AV.Query IN ('FL2','FL6','NEU.G','HE.B') AND AV.Response = 'Y' THEN '4'
        WHEN AV.Query = 'NOA' AND AV.Response = 'Y' THEN '6'
    ELSE NULL
    END),5) AS [IStatus]