2015-06-03 120 views
0

我有一个SQL表,显示每个人的收费金额和相关日期。我期待每月创建每个人的费用打印输出。我有以下代码可以显示所有人的一个月的数据,但我希望将它放在一个报告中,而不必在每个月的日期范围内重新运行此数据。有没有办法一次提取这些数据?从本质上讲,我想列显示:SQL:按日期范围对SUM值进行分组,并按日期在多列中显示

姓一月二月三月等

名AMT AMT AMT

这里是我的代码来拉这个数据,四月份的例子。你会看到日期代码为YYYYMMDD。此代码一次可以完美工作一个月。

select pm.last_name, SUM(amt) as Total_Charge from charges c 
inner join provider_mstr pm ON c.rendering_id = pm.provider_id 
where begin_date_of_service >= '20150401' and begin_date_of_service <= '20150431' 
group by pm.last_name 

回答

1

一个通用的解决方案使用SUM过的情况:

select pm.last_name, 
    SUM(case when begin_date_of_service >= '20150101' and begin_date_of_service < '20150201' then amt else 0 end) as Total_Charge_Jan, 
    SUM(case when begin_date_of_service >= '20150201' and begin_date_of_service < '20150301' then amt else 0 end) as Total_Charge_Feb, 
    SUM(case when begin_date_of_service >= '20150301' and begin_date_of_service < '20150401' then amt else 0 end) as Total_Charge_Mar, 
... 
from charges c 
inner join provider_mstr pm ON c.rendering_id = pm.provider_id 
where begin_date_of_service >= '20150101' and begin_date_of_service < '20160101' 
group by pm.last_name 

根据你的DBMS你可能有一个旋转功能或类似的...

+0

谢谢!这就是它 – Reid

1

变化SUM(AMT)作为Total_Charge到每个时段

SUM(CASE WHEN begin_date_of_service BETWEEN '20150401' AND '20150430' THEN amt ELSE 0 END) AS April_Amt 

SUM(CASE WHEN begin_date_of_service BETWEEN '20150301' AND '20150331' THEN amt ELSE 0 END) AS March_Amt 

和更新WHERE子句包括把所有日期范围以下。

+0

这不是一个有效的CASE语句,THEN和ELSE缺失。 – dnoeth

+0

谢谢@dnoeth,我更新了。 –

+0

关闭,现在删除多余的逗号:-) – dnoeth

0

的条件将在产品评价为1或0,所以你可以用下面的方法做一个选择性的总和:

select 
    pm.last_name, 
    SUM(amt * (begin_date_of_service >= '20150401' and begin_date_of_service <= '20150431')) AS 'april', 
    SUM(amt * (begin_date_of_service >= '20150501' and begin_date_of_service <= '20150530')) AS 'may' 
    ... 
from charges c 
inner join provider_mstr pm ON c.rendering_id = pm.provider_id 
group by pm.last_name