Sql server 选择DISTINCT CAST(大小写(当X为IN时)),然后选择1或0结束为位)作为INTO返回重复记录

Sql server 选择DISTINCT CAST(大小写(当X为IN时)),然后选择1或0结束为位)作为INTO返回重复记录,sql-server,Sql Server,我正在尝试选择过去1年半内任何时候都有糖尿病诊断代码的患者列表,并将1(患者确实有糖尿病诊断代码)或0(患者没有糖尿病诊断代码)返回到哈希表中供以后使用。我得到了我想要的1和0,但是对于许多患者,我同时返回1和0。我已经尽我所能尝试了故障排除,但未能为每个患者返回一个值。这是我一直在使用的查询 IF object_id('tempdb..#t4') IS NOT NULL DROP TABLE #t4 SELECT DISTINCT CAST( CASE

我正在尝试选择过去1年半内任何时候都有糖尿病诊断代码的患者列表,并将1(患者确实有糖尿病诊断代码)或0(患者没有糖尿病诊断代码)返回到哈希表中供以后使用。我得到了我想要的1和0,但是对于许多患者,我同时返回1和0。我已经尽我所能尝试了故障排除,但未能为每个患者返回一个值。这是我一直在使用的查询

IF object_id('tempdb..#t4') IS NOT NULL DROP TABLE #t4
SELECT DISTINCT CAST(
             CASE 
                  WHEN (diag_code IN ('250.00','250.01','250.02','250.03','250.10','250.11',
                        '250.12','250.13','250.20','250.21','250.22','250.23','250.30','250.31',
                        '250.32','250.33','250.40','250.41','250.42','250.43','250.50','250.51',
                        '250.52','250.53','250.60','250.61','250.62','250.63','250.70','250.71',
                        '250.72','250.73','250.80','250.81','250.82','250.83','250.90','250.91',
                        '250.92','250.93','357.2','362.01','362.02','362.03','362.04','362.05',
                        '362.06','362.07','366.41','648.00','648.01','648.02','648.03','648.04',
                        '111552007','111558006','11530004','123763000','127013003','127014009',
                        '190321005','190328004','190330002','190331003','190336008','190353001',
                        '190361006','190368000','190369008','190371008','190372001','190383005',
                        '190389009','190390000','190392008','190406000','190407009','190410002',
                        '190411003','190412005','190416001','190417004','190418009','190419001',
                        '190422004','193184006','197605007','198609003','199223000','199227004',
                        '199229001','199230006','199231005','199234002','201250006','201251005',
                        '201252003','23045005','230572002','230577008','237599002','237600004',
                        '237601000','237604008','237613005','237618001','237619009','237627000',
                        '25907005','26298008','267379000','267380002','2751001','275918005','28032008',
                        '28453007','290002008','309426007','310387003','311366001','312912001','313435000',
                        '313436004','314537004','314771006','314772004','314893005','314902007','314903002',
                        '33559001','34140002','359611005','359638003','359642000','360546002','371087003',
                        '38542009','39058009','39181008','408539000','408540003','413183008','414890007',
                        '414906009','420414003','420422005','421750000','421847006','421895002','422183001',
                        '422228004','422275004','423263001','424736006','424989000','425159004','425442003',
                        '426705001','426875007','427089005','428896009','42954008','44054006','4627003',
                        '46635009','50620007','51002006','5368009','54181000','57886004','59079001','5969009',
                        '70694009','73211009','74263009','75524006','75682002','76751001','81531005','81830002',
                        '8801005','91352004','9859006','31','E10.36','E11.36','E11.9','E13','E13.32','E13.33',
                        'E13.34','E13.35','E13.43','O24.42')) 
                     THEN 1 
                  ELSE 0 
             END AS bit) as DM,
            patientid
INTO #t4
FROM patient_diag
WHERE dateofservice >= CONVERT(DATETIME, '01-01-2014') 
使用
EXISTS
是否可以更好地解决这一问题?我也试过了,但很难得到想要的结果

这是不是使用EXISTS更好地解决的问题

对。如果患者同时拥有列表中的代码和列表中的代码,则您将同时获得1和0。EXISTS可以工作,但MAX可能更快:

SELECT MAX(CAST(
             CASE 
                  WHEN (diag_code IN ...
                        'E13.34','E13.35','E13.43','O24.42')) 
                     THEN 1 
                  ELSE 0 
             END AS bit)) as DM,
            patientid
INTO #t4
FROM patient_diag
WHERE dateofservice >= CONVERT(DATETIME, '01-01-2014') 
GROUP BY patientid
请注意,如果您将所有这些代码放在一个单独的表中,而不是在查询中硬编码,那么维护将更容易(性能可能更好)。或者,如果有主代码表,则可以添加查询使用的属性

这是不是使用EXISTS更好地解决的问题

对。如果患者同时拥有列表中的代码和列表中的代码,则您将同时获得1和0。EXISTS可以工作,但MAX可能更快:

SELECT MAX(CAST(
             CASE 
                  WHEN (diag_code IN ...
                        'E13.34','E13.35','E13.43','O24.42')) 
                     THEN 1 
                  ELSE 0 
             END AS bit)) as DM,
            patientid
INTO #t4
FROM patient_diag
WHERE dateofservice >= CONVERT(DATETIME, '01-01-2014') 
GROUP BY patientid

请注意,如果您将所有这些代码放在一个单独的表中,而不是在查询中硬编码,那么维护将更容易(性能可能更好)。或者,如果有主代码表,您可以添加查询使用的属性。

谢谢您的回复!必须将
END AS bit
更改为
END AS int
,然后我就可以走了@涂鸦很好。如果你想输出一点值,你也可以在最大值之后进行转换,但是使用任何适合你的方法。谢谢你的回复!必须将
END AS bit
更改为
END AS int
,然后我就可以走了@涂鸦很好。如果您想将值作为一个位输出,也可以在最大值之后进行强制转换,但使用适合您的任何方法。