[英]Ad hoc 2x2 contingency tables SQL Server 2008
我正在研究在SQL Server 2008中创建列联表的方法。它们不一定必须出现在2x2典型矩阵中。 我只想知道外面是否有人能找到比我更好的解决方案。
为了清楚起见,请参考图片。 为了简单起见,红色字母是正方形的名称。 标签X +表示X存在于该单元格中,反之亦然。
我将在查询所代表的表格中用方框字母标记查询
A
select count(*) from
(
select distinct p.patientid
from Patient as p
inner join icdpatient as picd on picd.patientid = p.patientid
and picd.admissiondate = p.admissiondate
and picd.dischargedate = p.dischargedate
inner join tblicd as t on t.icd_id = picd.icd_id
where t.icdText like '%x%'
) as t
inner join
(
select distinct p.patientid
from Patient as p
inner join icdpatient as picd on picd.patientid = p.patientid
and picd.admissiondate = p.admissiondate
and picd.dischargedate = p.dischargedate
inner join tblicd as t on t.icd_id = picd.icd_id
where t.icdText like '%y%'
) as s on s.patientid=t.patientid
B
select count(*) from
(
select distinct p.patientid
from Patient as p
inner join icdpatient as picd on picd.patientid = p.patientid
and picd.admissiondate = p.admissiondate
and picd.dischargedate = p.dischargedate
inner join tblicd as t on t.icd_id = picd.icd_id
where t.icdText like '%x%'
) as t
left join
(
select distinct p.patientid
from Patient as p
inner join icdpatient as picd on picd.patientid = p.patientid
and picd.admissiondate = p.admissiondate
and picd.dischargedate = p.dischargedate
inner join tblicd as t on t.icd_id = picd.icd_id
where t.icdText like '%y%'
) as s on s.patientid=t.patientid
where s.patientid is null
C
select * from
(
select distinct p.patientid
from Patient as p
inner join icdpatient as picd on picd.patientid = p.patientid
and picd.admissiondate = p.admissiondate
and picd.dischargedate = p.dischargedate
inner join tblicd as t on t.icd_id = picd.icd_id
where t.icdText like '%x%'
) as t
right join
(
select distinct p.patientid
from Patient as p
inner join icdpatient as picd on picd.patientid = p.patientid
and picd.admissiondate = p.admissiondate
and picd.dischargedate = p.dischargedate
inner join tblicd as t on t.icd_id = picd.icd_id
where t.icdText like '%y%'
) as s on s.patientid=t.patientid
where t.patientid is null
D我有点不满意,但我想我会做类似的事情
declare @d int
set @d = (select count(distinct p.patientid) from Patient as p) - b -c
这样做的目的是找到整个种群,并仅用X和y减去那些
是! 有更简单的方法。 假设您的加入不会产生重复的患者:
select (case when t.icdText like '%x%' then 'X' else 'NO-X' end) as X,
(case when t.icdText like '%y%' then 'Y' else 'NO-Y' end) as Y,
count(*) as cnt
from Patient p inner join
icdpatient picd
on picd.patientid = p.patientid and
picd.admissiondate = p.admissiondate and
picd.dischargedate = p.dischargedate inner join
tblicd t
on t.icd_id = picd.icd_id
group by (case when t.icdText like '%x%' then 'X' else 'NO-X' end),
(case when t.icdText like '%y%' then 'Y' else 'NO-Y' end)
否则,将count(*)替换为:
count(distinct patientid)
这应该为您提供列联表所需的信息。
这是另一种方法:
select RRTGotAlert = case RRTGotAlert when 0 then 'N' when 1 then 'Y' end
,TZ_OnPilotUnit_N = sum(TZ_OnPilotUnit_N)
,TZ_OnPilotUnit_Y = sum(TZ_OnPilotUnit_Y)
from (select RRTGotAlert
,TZ_OnPilotUnit_N = [0]
,TZ_OnPilotUnit_Y = [1]
from #analysis
pivot (count(Encounter) for TZ_OnPilotUnit in ([0],[1])) pvt) got_alert
group by case RRTGotAlert when 0 then 'N' when 1 then 'Y' end
order by case RRTGotAlert when 0 then 'N' when 1 then 'Y' end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.