2011-09-08 22 views
0

早安,CTE不评估所有的选择标准正确

我已经写了下面的存储过程,搜索具有指定为指定的程序和标志一个或多个收费代码记录那些为ProcGrouper = 1和必要性识别那些没有对比费用的账户(标记为ContrastGrouper = 0)。

当我运行sproc和审计帐户时,我看到很多对比费用。因此,CTE似乎没有正确评估所有标准。我该如何补救?

with cteGrouper 
as 
(
SELECT [ENCOUNTER NUMBER], 
[DATE OF SERVICE], [FEEDER KEY], 
[CHGDTL CPT4 CODE], CASE 
WHen [FEEDER KEY] IN ('76803520121','76803520120','76803520112','76803520111', 
'76803520110','76803520109','76803520108','76803520034','76803520030','76803520027', 
'76803520025','76803520017','76803520015','76803520014','76803510073','76803510072', 
'76803510064','76803510012','76803510011','76803510008','76803510003','76803510002', 
'76803510068','76803520031','76803520028','76803520107','76803520022','76803520020', 
'76803520106','76803510009','76803510070','76803510069','76803510067','76803510065', 
'76803510074','76704027052','76606123003','76606123001','76606120012','76606111003', 
'76606102043','76606100011','76606102040','76606121006','76606121009','76606123002', 
'76606102053','76606102042') then 1 else 0 
end as ProcGrouper, 
Case when [Feeder Key] in ('76806360076', '76806360077','76806360089','76806360090', 
'76306360509','76306360513','76306360514','75706362105','76806366053','75706366054', 
'75706366055','76606360099') then 1 else 0 
end as ContrastGrouper 
FROM ENCOUNTERCHGDTL 
where ([Date of Service] between @StartDate and @EndDate) 
), 
cteFilterAccounts 
as 
(
Select [Encounter Number], 
[Date of Service], [Feeder Key], 
[Chgdtl CPT4 Code], ProcGrouper, ContrastGrouper 
from cteGrouper 
where ProcGrouper=1 
and ContrastGrouper=1 
) 

Select [Encounter Number], 
[Feeder Key], 
[Date of Service], 
[Chgdtl CPT4 Code] 
,[ADMITDATE - CCYYMMDD], [DISCHARGEDATE - CCYYMMDD], 
[DISCHARGEDISPOSITION], ProcGrouper, ContrastGrouper 
from cteGrouper 
join Encounter on [Encounter Number]=[EncounterNumber] 
and AdmitSubService <>'SIG' 
and HSP#='1' 
and ActualTotalCharge>0 
where ProcGrouper=1 
and ContrastGrouper=0 
and [Encounter Number] not in 
(Select [Encounter Number] from cteFilterAccounts) 

Order by [ENCOUNTER NUMBER] 
END 
+0

也许关于你得到什么结果和你期望得到的结果的更多细节可以帮助我们摆脱困境。 – HLGEM

+0

@HLGEM我在ContrastGrouper语句中看到有一个馈线键的帐户。只要他们的ProcGrouper的评估结果为1,我想排除这些帐户。 – SidC

+0

在指定的时间段内,是否可以有多个具有相同帐户的行?如果是这样,他们可以有不同的馈线键吗? –

回答

1

我想你应该重新定义你的cteFilterAccounts CTE。问题是,您现在的CTE代码会返回一组个人cteGroup同时具有ProcGrouper=1ContrastGrouper=1。基于对cteGroup代码,可以永远不可能的,因为行可以有一个[Feeder Key]属于不超过一个两组,所以它的要么ProcGrouper=1ContrastGrouper=1,但不能同时使用。因此,CTE不会返回任何结果。

尽管在逻辑上,您似乎在搜索同时在全球范围内设置了两个属性的行,即在期间内的。一个可能的解决方案是使用连接,像这样:

cteFilterAccounts AS (
    SELECT g1.[Encounter Number] 
    FROM (
    SELECT DISTINCT [Encounter Number], 
    FROM cteGrouper 
    WHERE ProcGrouper=1 
) g1 
    INNER JOIN (
    SELECT DISTINCT [Encounter Number], 
    FROM cteGrouper 
    WHERE ContrastGrouper=1 
) g2 ON g1.[Encounter Number] = g2.[Encounter Number] 
) 

该查询从在期限内发现,有类似的列表,其中[Feeder Key]属于另一组一组加入与[Feeder Key]所有[Encounter Number]值。匹配值会给出结果集。

另外,您可以使用INTERSECT:

cteFilterAccounts AS (
    SELECT [Encounter Number], 
    FROM cteGrouper 
    WHERE ProcGrouper=1 
    INTERSECT 
    SELECT [Encounter Number], 
    FROM cteGrouper 
    WHERE ContrastGrouper=1 
) 

基本上,它使用相同的逻辑连接。

您也可以尝试一种完全不同的方式,分组,像这样:

cteFilterAccounts AS (
    SELECT [Encounter Number] 
    FROM cteGrouper 
    GROUP BY [Encounter Number] 
    HAVING MAX(ProcGrouper) = 1 
    AND MAX(ContrastGrouper) = 1 
) 

这里你选择那些既Grouper属性最大(聚合)值等于1

独立的帐户
+0

我实施了你的第一个建议。它非常完美!非常感谢您的帮助:) – SidC