我有一套数据,需要用这样的规则来统计病人的就诊情况:
示例数据:
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
在本例中,我的最终计数将基于分组rowId 1、2、3进行1次访问;将第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,我会没事的。这是doctorId和ReasonCode在涉及2名医生的场景中的逻辑,而在另一位医生中,医生it和日期是相同的医生。我已经很长时间没有深入了解Server了,所以有可能是一个通用的表表达式是解决方案,但我没有看到它。我使用的是Sql Server 2014,性能方面有很好的延迟。我将寻找产生上述结果的sql服务器查询。据我所知,没有办法像我所需要的那样把它分类。
发布于 2016-04-10 16:34:09
答案是一个and子句,并在最后计数之前对每个集合进行分组。有时候,我们把事情搞得太复杂了。
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:Sql Fiddle
https://stackoverflow.com/questions/36490905
复制相似问题