我有一个如下的数据集:
ID Medication Dose
1 Aspirin 4
1 Tylenol 7
1 Aspirin 2
1 Ibuprofen 1
2 Aspirin 6
2 Aspirin 2
2 Ibuprofen 6
2 Tylenol 4
3 Tylenol 3
3 Tylenol 7
3 Tylenol 2
我想开发一个代码,以识别多次使用药物的患者。因此,例如,ID 1含有两次阿司匹林,ID 2含有两次阿司匹林,ID 3含有三倍泰诺。
我可能是错的,但是我认为最简单的方法是使用与以下代码相似的代码将基于ID的每个ID连接起来;但是我不太确定之后该怎么做-是否可以计算一个字符串是否在一个单元格中出现两次?
SELECT DISTINCT ST2.[ID],
SUBSTRING(
(
SELECT ','+ST1.Medication AS [text()]
FROM ED_NOTES_MASTER ST1
WHERE ST1.[ID] = ST2.[ID]
Order BY [ID]
FOR XML PATH ('')
), 1, 200000) [Result]
FROM ED_NOTES_MASTER ST2
我希望输出看起来像这样:
ID MEDICATION Aspirin2x Tylenol2x Ibuprofen2x
1 Aspirin, Tylenol , Aspirin YES NO NO
2 Ibuprofen, Aspirin, Aspirin YES NO NO
3 Tylenol, Tylenol ,Tylenol NO YES NO
答案 0 :(得分:3)
对于问题的第一部分(确定多次使用特定药物的患者),您可以使用GROUP BY将ID和药物分组,然后使用COUNT来获取每种药物多少次被给予每位患者。例如:
SELECT ID, Medication, COUNT(*) AS amount
FROM ST2
GROUP BY ID, Medication
这将为您提供表中显示的所有ID-药物组合的列表,以及每个组合出现次数的计数。要将这些结果限制为仅大于2的结果,可以使用HAVING向COUNTed字段添加条件:
SELECT ID, Medication, COUNT(*) AS amount
FROM ST2
GROUP BY ID, Medication
HAVING amount >= 2
现在的问题是以所需的方式格式化结果。您将从上面的查询中得到的是所有患者的列表-多次出现在表格中的药物组合,例如:
ID | Medication | Count
------+---------------+-------
1 | Aspirin | 2
2 | Aspirin | 2
3 | Tylenol | 3
我建议您尝试使用这种格式,因为您已经发现,要像逗号一样在“用药”列中获取多个以逗号分隔的列表返回的值,则必须采取一些措施来获取它可以正常工作(尽管SQL Server的最新版本确实实现了某种适当的组串联功能。)。如果您确实需要Aspirin2x等专栏,请take a look at the PIVOT operation in SQL Server.