SQL - 获取具有相同日期的值的总和

时间:2015-07-22 16:13:20

标签: sql sql-server

我确定我之前已经完成了1000次此类操作,但出于某种原因,这对我不起作用。我正在做一份报告,以确定患者是否在一天内接受药物治疗。因此,无论他们在一天中获得1次或5次剂量,该值应为1.工作人员也会对系统进行校正,这些校正为负值。因此,我需要将每天的所有剂量值相加,如果它是+值则为1,否则为0。

此时我想要完成的是每个日期有1行为1或0。

这是我的SQL查询,用于对值进行求和:

SELECT
    DIM_DRUG_NAME_SHORT.Drug_Name_Short AS 'Med_Name_Short'
    , SUM(Baseline.Doses) as 'DOT'
    , Day(Baseline.Dispense_Date) as 'd_Date'
FROM    
    FACT_AMS_Baseline_Report Baseline
    INNER JOIN DIM_DRUG_NAME_SHORT ON Baseline.Med_Name_ID = DIM_DRUG_NAME_SHORT.Drug_Name_Long
    INNER JOIN DIM_Date tDate ON Baseline.Dispense_Date = tDate.Date

WHERE
    Baseline.Encounter = '00000001/01'

GROUP BY
    DIM_DRUG_NAME_SHORT.Drug_Name_Short
    , Baseline.Dispense_Date
    , Doses

Order By
    Drug_Name_Short

暂时我只是将一次遭遇从数据集中拉出来进行测试。 这是我得到的输出。我还在选择中包括了Day,以表明同一天来了两次而且他们没有得到Summed。

以下是我得到的输出示例:

Med_Name_Short  DOT day of month
CEFTRIAXONE     1   15
CEFTRIAXONE     1   16
CEFTRIAXONE     4   16
CEFTRIAXONE     1   17
CEFTRIAXONE     1   18
CEFTRIAXONE     1   20
CEFTRIAXONE     -3  21
CEFTRIAXONE     1   21
CEFTRIAXONE     -1  23
PROPRANOLOL     -1  24
PROPRANOLOL     3   24
PROPRANOLOL     1   25
PROPRANOLOL     2   26
PROPRANOLOL     2   27

我希望在此看到的是第16天是5,第21天是-2,第24天是-2。

非常感谢任何帮助。 感谢

3 个答案:

答案 0 :(得分:2)

从“分组依据”列表中删除剂量。您正在使用它的聚合函数(SUM)是正确的,因此它不应该在GROUP BY中。

答案 1 :(得分:1)

我认为你不应该按剂量进行分组。如果没有看到您的数据,我只能猜测,例如,16日有2个剂量的数量2。

所以试试:

SELECT
    DIM_DRUG_NAME_SHORT.Drug_Name_Short AS 'Med_Name_Short'
    , SUM(Baseline.Doses) as 'DOT'
    , Day(Baseline.Dispense_Date) as 'd_Date'
FROM    
    FACT_AMS_Baseline_Report Baseline
    INNER JOIN DIM_DRUG_NAME_SHORT ON Baseline.Med_Name_ID = DIM_DRUG_NAME_SHORT.Drug_Name_Long
    INNER JOIN DIM_Date tDate ON Baseline.Dispense_Date = tDate.Date

WHERE
    Baseline.Encounter = '00000001/01'

GROUP BY
    DIM_DRUG_NAME_SHORT.Drug_Name_Short
    , Baseline.Dispense_Date

Order By
    Drug_Name_Short

答案 2 :(得分:0)

由于您在剂量上进行聚合,您应该将其从组中移除,并且要获得剂量1或0,请使用案例表达式:

SELECT
    DIM_DRUG_NAME_SHORT.Drug_Name_Short AS 'Med_Name_Short'
    , CASE WHEN SUM(Baseline.Doses) >= 1 THEN 1 ELSE 0 END AS 'DOT'
    , Day(Baseline.Dispense_Date) as 'd_Date'
FROM    
    FACT_AMS_Baseline_Report Baseline
    INNER JOIN DIM_DRUG_NAME_SHORT ON Baseline.Med_Name_ID = DIM_DRUG_NAME_SHORT.Drug_Name_Long
    INNER JOIN DIM_Date tDate ON Baseline.Dispense_Date = tDate.Date

WHERE
    Baseline.Encounter = '00000001/01'

GROUP BY
    DIM_DRUG_NAME_SHORT.Drug_Name_Short
    , Baseline.Dispense_Date 

Order By
    Drug_Name_Short

如果allocatese_date是日期时间值,您应该在组中使用Day(Baseline.Dispense_Date)或删除时间部分。 如果您按天分组并且您的数据超过一个月,您应该限制范围或包括年和月,以便不同月份/年的数据不会被总结。

使用您的示例数据,您应该得到如下结果:

Med_Name_Short  DOT day of month
CEFTRIAXONE     1   15
CEFTRIAXONE     1   16
CEFTRIAXONE     1   17
CEFTRIAXONE     1   18
CEFTRIAXONE     1   20
CEFTRIAXONE     0   21
CEFTRIAXONE     0   23
PROPRANOLOL     1   24
PROPRANOLOL     1   25
PROPRANOLOL     1   26
PROPRANOLOL     1   27