好的 - 我有一个简单的表 - 下面 - 我要做的是只识别那些具有共享值的行 - 所以任何有共享" apc"值 - DO x else Do Y
CREATE TABLE #test (hcpcs varchar(10), apc varchar(100), rate money)
INSERT INTO #test (hcpcs, apc)
SELECT '97110', '8009'
UNION ALL
SELECT '71020', '8009'
UNION ALL
SELECT '85025', '8006'
所以 - 从上面 - 所有那些共享" 8009" - 我会将这些行格式化以进行更新 - 它们将共享相同的" rate"。用" 8006"行将不会成为该更新的一部分
答案 0 :(得分:0)
你想:
WHERE EXISTS (SELECT *
FROM #test t2
WHERE t2.apc = #test.apc
AND t2.hcpcs != #test.hcpcs)
确保将apc
编入索引,以便有效地完成此操作。
答案 1 :(得分:0)
IMO获得所有预期结果的最舒适方式是使用SQL-Server的OVER Klause。
select *, count(*) over (partition by apc) as CNT
from #test order by CNT desc
将返回所有行以及重复信息(仅使用order子句,因此您可以很容易地使用它)。
要将此更改为更新,我将使用CTE:
with T1 as (select hcpcs, count(*) over (partition by apc) as CNT
from #test)
update #test
set rate=@newrate
from #test inner join t1 on #test.hcpcs=T1.hcpcs
where CNT > 1
(请注意,order by子句必须消失 - 它在CTE中是不允许的,无论如何都无用:))
答案 2 :(得分:0)
只需将任何内容更改为CASE表达式即可。您可以使用OUTPUT子句检查它的作用,然后在实际查询中将其删除。
UPDATE T
SET rate = CASE WHEN SRC.CNT > 1 THEN rate*5.00 ELSE rate*2.00 END
OUTPUT inserted.apc, deleted.rate old_rate, inserted.rate NEW_rate -- This is just to show results for testing
FROM #test T
JOIN (SELECT apc, COUNT(*) CNT
FROM #test
GROUP BY apc) SRC ON SRC.apc = T.apc