SQL根据两个不同变量中的日期计算列的总和

时间:2016-06-02 09:07:08

标签: sql oracle

我在这个表格中有一个简单的表格:

BillItem (id,amount, volume, bill_date,....other fields)

我想在我的查询中根据日期获得4个不同的字段数量和数量

例如,在我的表格中我有这个数据:

Id | amount | volume | bill_date | libelle
1  | 10     | 50     | 02/04/2016| bill1       
2  | 20     | 55     | 02/04/2016| bill1
2  | 88     | 66     | 02/05/2016| bill1
3  | 30     | 60     | 03/05/2016| bill2
4  | 40     | 10     | 02/04/2016| bill3
5  | 50     | 20     | 02/05/2016| bill3

,结果必须如下:

bill1, sum_date_1=30, sum_date_2=88, sum_volume_date_1=105, sum_volume_date_2=66
bill2, sum_date_1=0, sum_date_2=30, sum_volume_date_1=0, sum_volume_date_2=60
bill3, sum_date_1=40, sum_date_2=50, sum_volume_date_1=10, sum_volume_date_2=20

我的查询只有两个和变量:

select ans.SERVICE_TYPE, ans.SERVICE_SUB_TYPE,
sum(bi.ACTUAL_AMOUNTVAT),sum(bi.ACTUAL_VOLUME), bi.BILL_DATE 
from bill_item bi left outer join ANALYTIC_SECTION ans on ans.TREE_PATH=bi.REPORT_SECTION
where bi.account_id=7
and bi.BILL_DATE<='31/05/2016' and bi.BILL_DATE>='01/04/2016' 
and ans.REPORT_TYPE='ARPE_REPORT' and ans.ACCOUNT_ID=7
group by ans.SERVICE_TYPE, ans.SERVICE_SUB_TYPE, bi.BILL_DATE; 

是否可以为每个字段(数量和体积)获得两个不同的总和?

2 个答案:

答案 0 :(得分:0)

在我看来,您希望按每个日期汇总,然后在升序字段中返回月份的值?

它可能适用于子查询和排名选项,尽管这可能不是最有效的路径。

    Select t.Id
     ,  Max(Case When t.BillRank=1 Then t.SumVolume Else Null End) As Volume1
     , Max(Case When t.BillRank=2 Then t.SumVolume Else Null End) As Volume2 
     , Max(Case When t.BillRank=1 Then t.SumVAT Else Null End) As Vat1 
     , Max(Case When t.BillRank=2 Then t.SumVAT Else Null End) As Vat2 
From    ( Select    ans.SERVICE_TYPE
                  , ans.SERVICE_SUB_TYPE
                  , Sum(bi.ACTUAL_AMOUNTVAT) As SumVAT
                  , Sum(bi.ACTUAL_VOLUME) As SumVolume 
                  , bi.BILL_DATE
                  , bi.Id
                  , Rank() Over ( Partition By bi.Id Order By bi.BILL_DATE Asc ) As BillRank
          From      bill_item As bi
                    Left Outer Join ANALYTIC_SECTION as ans
                        On ans.TREE_PATH = bi.REPORT_SECTION
          Group By  ans.SERVICE_TYPE
                  , ans.SERVICE_SUB_TYPE
                  , bi.BILL_DATE
                  , bi.Id
        ) t
Group By t.Id; 

答案 1 :(得分:0)

我已经解决了这样的问题:

select distinct ans.SERVICE_TYPE, ans.SERVICE_SUB_TYPE,
sum(Case when bi.BILL_DATE<'01/05/2016' then bi.ACTUAL_AMOUNTVAT ELSE 0 END) as amount_m1,
sum(Case when bi.BILL_DATE>='01/05/2016' then bi.ACTUAL_AMOUNTVAT ELSE 0 END) as amount_m,
sum(Case when bi.BILL_DATE<'01/05/2016' then bi.ACTUAL_VOLUME ELSE 0 END) as volume_m1,
sum(Case when bi.BILL_DATE>='01/05/2016' then bi.ACTUAL_VOLUME ELSE 0 END) as volume_m
--,bi.BILL_DATE 
from bill_item bi left outer join ANALYTIC_SECTION ans on ans.TREE_PATH=bi.REPORT_SECTION
where bi.account_id=7
and bi.BILL_DATE<='06/05/2016' and bi.BILL_DATE>='06/04/2016' 
and ans.REPORT_TYPE='ARPE_REPORT' and ans.ACCOUNT_ID=7
group by ans.SERVICE_TYPE, ans.SERVICE_SUB_TYPE;

感谢所有人的帮助