有人可以帮助我吗?示例:我遇到的问题是帐户有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');
答案 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]