计算跨列的参与百分比

时间:2013-09-30 21:29:30

标签: sql sql-server

我不确定这个问题是否准确,但我想不出办法。我将尝试使用一个例子来解释它。

考虑具有visitID(VID),patientID(PID)和hospitalID(HID)属性的各个医院就诊表。

 VID  PID  HID
  1    A    x
  2    A    y
  3    A    x
  4    B    z
  5    B    z

我要做的是识别PID-HID对,其中该PID的总VID的50%以上是指定的HID。在这种情况下,我希望它返回“A& x”,因为PID“A”的总VID的2/3处于HID“x”和“B& Z”,因为“B”的所有VID都是在“z”

3 个答案:

答案 0 :(得分:2)

这可能很讨厌,但我认为它可以做到这一点。 它假设您的表名为visits

;with infoCte as (
select pid, hid, count(*) as visitcount
from visits
group by pid, hid
) 

select * 
from infocte i
where visitcount > (
    select count(*) / 2 as midcount
        from visits v
        where v.pid = i.pid
) 

第一部分获得患者和医院的所有访问次数。第二部分将结果限制为仅有50%以上时间访问过该特定医院的人。如果您需要50%及以上,请将>更改为>=

答案 1 :(得分:0)

试试这个:

select PID,HID,100*cast(PHtotal as float)/Ptotal as PHperc
from
  (select PID,count(*) as Ptotal from tbl group by PID) t,
  (select PID,HID,count(*) as PHTotal from tbl group by PID,HID) s
where s.PID=t.PID and cast(PHtotal as float)/Ptotal>0.5

编辑:添加错过的演员阵容

答案 2 :(得分:0)

适用于SQL 2012。

这是SqlFiddle上的演示。

with cte
as
(
select *, COUNT(PID) OVER(PARTITION BY PID, HID ORDER BY HID)*100.00/COUNT(PID) OVER(PARTITION BY PID ORDER BY PID) cnt
from visits
)

select *
from cte 
where cnt > 50