返回" group"中的行 - 特定于某些值 - 仅限于那些值

时间:2014-08-12 22:04:33

标签: sql sql-server tsql

我有一个表 - 包含claimID和procedureCode列 - 可以有多个procedureCode值分配给claimID - 我有一个查询,我说 -

SELECT claimID FROM #table WHERE procedureCode IN ('1234','6789')

这显然让我回复所有带有这些procedureCodes的claimIDs - 返回的claimIDs也可能包含其他的procedureCodes - 所以我需要做的就是说只返回claimIDs,其中只有procedureCodes' 1234&# 39;和' 6789'存在 - 没有与claimIDs相关联的其他procedureCodes。

确定 - 在下面 - 我需要一个claimIDs列表WHERE procedureCode IN(' 1234',' 5678') - 并且只有那些代码 - 所以claimID 1符合资格但不符合claimID 2作为claimID 2有另一个不在的procedureCode(' 1234',' 5678')

CREATE TABLE #claims (claimID int, procedureCode varchar(10))
INSERT INTO #claims 
SELECT 1, '1234'
UNION
SELECT 1, '5678'
UNION
SELECT 2, '4455'
UNION
SELECT 2, '1234'
UNION
SELECT 3, '8899'
UNION
SELECT 3, '6677'

SELECT * FROM #claims

这是我的真实"查询 - 我想说 - 通过以下内容 - 带回所有行代码所在的行(' 99281',' 99282',' 99283',&# 39; 99284',' 99285') - 但现在需要说 - 只收回ClaimNo所声明的声明(' 99281',' 99282&# 39;,' 99283',' 99284',' 99285')与它相关联,只有那些代码 - 没有其他 - 有意义吗?

SELECT DISTINCT procedureCode,
COUNT(claimNo),
SUM(CAST(a.amount as money))/COUNT(claimNo) AS [837_Claim_Amt] ,
SUM(CAST(b.ClaimAmount as money))/COUNT(claimNo) AS [835_Claim_Amt],
SUM(CAST(b.ClaimPaid as money))/COUNT(claimNo) AS [835_Claim_Paid_Amt]
FROM ##Claims837 a
JOIN ##835Claims b ON a.claimNo = b.ClaimID
JOIN edi_paidclaimlines p ON b.ID = p.claimID
WHERE p.procedureCode IN ('99281', '99282', '99283', '99284', '99285')
GROUP BY procedureCode
ORDER BY procedureCode

4 个答案:

答案 0 :(得分:0)

如果您只有很少的值,这是最有效且最易读的方式:

SELECT t1.claimID FROM #claims t1 
WHERE  t1.procedureCode IN ('1234','6789')
AND NOT EXISTS
(
    SELECT 1 FROM #claims t2
    WHERE t2.ClaimID = t1.ClaimID
      AND t2.procedureCode NOT IN ('1234','6789')
)

以下是您的示例数据:http://sqlfiddle.com/#!6/d41d8/20800/0

查询不会产生任何记录,因为所有匹配的claimID都有另一个procedureCode,而不是('1234','6789')。

答案 1 :(得分:0)

试试这个:

select *
into   #onlyIncluded
from   #table
where  ProcedureCode in ('1234','6789')

select distinct claimid
into   #thoseToExclude
from   #table
where  ProcedureCode not in ('1234','6789')

select  distinct claimid
into    #Final
from    #onlyIncluded
where   claimid not in (select claimid from #thoseToExclude)

答案 2 :(得分:0)

也许有点简单...

select ClaimID
from #claims
group by ClaimID
-- the count of claims in your list match the total count of claims
having count(*) = sum(case when procedureCode IN ('1234','6789') then 1 else 0 end)

答案 3 :(得分:0)

    SELECT DISTINCT ClaimId FROM #table
    WHERE ProcedureCode IN ('1234','6789')
    EXCEPT
    SELECT ClaimId FROM #table
    WHERE ProcedureCode NOT IN ('1234','6789')