识别一个字符串出现多次的记录

时间:2019-09-10 13:03:16

标签: 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          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

1 个答案:

答案 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.