繁体   English   中英

Sql Server组按列集

[英]Sql Server group by sets of columns

我有一个数据集,我需要用这样的规则计算患者就诊次数:

  1. 无论原因如何,在同一天内对同一位医生进行两次或两次以上的就诊计为1次就诊
  2. 出于同样原因,对不同医生的两次或更多次就诊计为1次就诊
  3. 由于不同原因,在同一天对不同医生进行两次或两次以上的就诊计为两次或更多次就诊。

示例数据:

DoctorId      PatientId       VisitDate       ReasonCode   RowId
--------      ---------       ---------       ----------   -----
1              100             2014-01-01        200         1 
1              100             2014-01-01        210         2
2              100             2014-01-01        200         3
2              100             2014-01-11        300         4
1              100             2014-01-15        200         5
2              400             2014-01-15        200         6

在这个例子中,我的最终计数将基于对1次访问的rowId 1,2,3进行分组; 将第4行分组为1次访问,将第5行分组为1次访问,对患者100进行总共3次访问。患者400也有1次访问。

patientid   visitdate   numberofvisits
---------   ---------   --------------
100         2014-01-01   3
100         2014-01-11   1
100         2014-01-15   1
400         2014-01-15   1

我被困在哪里是如何处理组,以便我得到涵盖的不同场景。 如果分组是医生,约会,我会没事的。 如果是医生,日期,ReasonCode,我会没事的。 这是在涉及2名医生的情况下的doctorId和ReasonCode的逻辑,并且当它是同一位医生时,医生和日期在另一位医生。 我很久没有深入研究过Sql Server了,所以有一种常见的表表达式是解决方案,而我却没有看到它。 我正在使用Sql Server 2014,并且在性能上有相当的优势。 我会寻找一个产生上述结果的sql server查询。 我能说的最好,没有办法按照我需要的方式对它进行分组。

答案是一个except子句,并在最终计数之前对每个集合进行分组。 有时,我们过于复杂。

DECLARE @tblAllData TABLE
(   
      DoctorId              INT NOT NULL
    , PatientId         INT NOT NULL
    , VisitDate         DATE NOT NULL
    , ReasonCode    INT NOT NULL
    , RowId                 INT NOT NULL
)

INSERT @tblAllData 
SELECT
        1,100,'2014-01-01',200,1
UNION ALL 
SELECT
    1,100,'2014-01-01',210,2
UNION ALL 
SELECT
2,100,'2014-01-01',200,3
UNION ALL 
SELECT
2,100,'2014-01-11',300,4
UNION ALL 
SELECT
1,100,'2014-01-15',200,5
UNION ALL 
SELECT
2,400,'2014-01-15',200,6

DECLARE @tblTempCountedRows AS TABLE
(
       PatientId                        INT NOT NULL    
    , VisitDate                     DATE
    , ReasonCode                INT 
)
INSERT @tblTempCountedRows

    SELECT PatientId, VisitDate,0 
         FROM @tblAllData       
    GROUP BY PatientId, DoctorId, VisitDate 
EXCEPT 
SELECT PatientId, VisitDate, ReasonCode
 FROM @tblAllData
 GROUP BY PatientId, VisitDate, ReasonCode

 select * from @tblTempCountedRows 

    DECLARE @tblFinalCountedRows AS TABLE
(
    PatientId                       INT NOT NULL    
 , VisitCount                   INT
)
 INSERT @tblFinalCountedRows 
SELECT 
    PatientId
, count(1) as Member_visit_Count
FROM
    @tblTempCountedRows 
GROUP BY PatientId

SELECT * from @tblFinalCountedRows

这是一个Sql Fiddle的结果: Sql Fiddle

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM