Sql 标识字符串多次出现的记录
我的数据集如下所示:Sql 标识字符串多次出现的记录,sql,sql-server,Sql,Sql Server,我的数据集如下所示: 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
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连接起来;但我不太确定接下来该怎么办——如果一个字符串在一个单元格中出现两次,是否可以计数
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
对于问题的第一部分(识别多次服用特定药物的患者),您可以使用GROUP BY to GROUP BY ID和药物进行此操作,然后使用COUNT获得每个患者每次服用药物的次数。例如:
SELECT ID, Medication, COUNT(*) AS amount
FROM ST2
GROUP BY ID, Medication
这将为您提供表中显示的所有ID药物组合的列表,以及每个组合出现的次数计数。要将这些结果限制为大于2的结果,可以使用have向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等列,您使用的是什么版本的SQL Server?您在这里遇到了困难,因为关系数据不是这样工作的。您需要在这里使用动态SQL来生成这些列。然后,您需要使用聚合来计算每个字符串,然后再将它们合并到一个元组中。搜索此项“动态轴心”网站。关于如何生成列,有几十个示例。从这里开始,计算值的附加聚合并不困难。@TimBiegeleisen 2012虽然这可能会有帮助,但它不会生成OP所期望的输出。检查内容-字符串格式,以防万一。这解决了问题的第一部分OP的问题(识别重复的患者-医学组合)。对于第二部分(如何显示结果),我认为OP应该在客户端处理,而不是直接在SQL中处理。