Sql Case语句逻辑功能不全

Sql Case语句逻辑功能不全,sql,sql-server-2012,Sql,Sql Server 2012,下面是我期望从脚本中得到的一些示例结果: 示例1:仅向客户12提供服务“NEI2”。那么结果应该是 AcctNum PStatus IStatus 12 1 5 AcctNum PStatus IStatus 21 3 2 21 4 5 示例2:如果客户21的服务为“PN20”、“PN4”和“FL1”,则结果应为 AcctNum PStatus IStatus 12 1

下面是我期望从脚本中得到的一些示例结果: 示例1:仅向客户12提供服务“NEI2”。那么结果应该是

AcctNum  PStatus  IStatus
12       1        5
AcctNum  PStatus  IStatus
    21       3        2
    21       4        5
示例2:如果客户21的服务为“PN20”、“PN4”和“FL1”,则结果应为

AcctNum  PStatus  IStatus
12       1        5
AcctNum  PStatus  IStatus
    21       3        2
    21       4        5
回答将始终为“Y”。如果需要,可以修改脚本。多谢各位

以下是脚本:

    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');

您想按状态分组吗

SELECT 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 NULL
        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 NULL
        END) AS [IStatus]
FROM AData AS AD INNER JOIN
     AVisit AS AV
     ON AD.Visit = AV.Visit 
WHERE 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, 
       (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],
       (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];

我已将您的查询修改为
分组依据
科目
,以及
[Pstatus]
[IStatus]
的值

不要相信有可能实现示例2中的建议,即生成SQL分组/合并规则以将行值(3,5)(4,5)(5,2)合并到(3,2)(4,5)中:

示例2:如果客户21具有服务“PN20”、“PN4”和“FL1”,则 结果应该是

AcctNum  PStatus  IStatus
12       1        5
AcctNum  PStatus  IStatus
    21       3        2
    21       4        5

我的建议是将您的数据分组到
AcctNum
,以及
[Pstatus]
[IStatus]
的值,因为任何“更多”都需要超出其价值的复杂性:

SELECT
      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');

    GROUP BY 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),
      (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)

在您的问题中,
AcctNum
的值是什么?分组后只会产生一行?有这么多不同的帐号。有些帐号有一个查询,有些有2个或3个查询。回答将始终为“Y”。对不起,我没有跟上。“正确结果”中产生的信息的含义是什么?用户应如何解释/阅读结果?根据我对您的需求的理解程度,我已为您的问题添加了我的答案。不同的查询和订单意味着提供不同的服务。因此,为客户提供了不同的服务。我需要找出哪个客户接受了哪个服务。示例:如果客户A收到'NEI2','DO2','REF',则结果将类似于1,1和5,3。嗨,克里斯!我修改了我的问题。请看一下,如果可以的话请帮忙。谢谢。嗨,戈登,我用我期待的结果的例子修改了我最初的问题。非常感谢。