sql sum case datewise

时间:2018-01-31 12:23:23

标签: sql sum case

我有一张包含以下场地的桌子。

Field1   Field2    Field3    Filed4 
Date     Trantype  AssetType Amount
01/01/18 Pur      EQU       100
01/01/18 Sal      EQU       50
02/01/18 Pur      EQU       100
02/01/18 Sal      EQU       50

需要输出

Date   Total Purchase    Total Sale  Net Pur Amount 
01/01/18 100              50           50

我希望按日期汇总并扣除每个日期的销售和销售。对于PUR和SALF,SAL可以有多种类型的PURF,PUR等trantype。所以我用case case语来关闭。

SELECT 
       sum(CASE 
           WHEN tran_type in ('PUR','PURF','ISPUR','BONPUR','CONPUR','PMALL','INJVSP','CUSTTO','DPURF','ISDPUR','MFALL') THEN nett_val
           ELSE 0
       END)/10000000 AS Purchase
       , sum(CASE 
           WHEN tran_type not in ('PUR','PURF','ISPUR','BONPUR','CONPUR','PMALL','INJVSP','CUSTTO','DPURF','ISDPUR','MFALL') THEN nett_val
           ELSE 0 
       END)/10000000 AS Sale
, sum(CASE 
           WHEN tran_type in ('PUR','PURF','ISPUR','BONPUR','CONPUR','PMALL','INJVSP','CUSTTO','DPURF','ISDPUR','MFALL') THEN nett_val
           ELSE -1*nett_val 
       END)/10000000 AS Net_Purchase 
,sum(CASE 
           WHEN tran_type not in ('DPURF') THEN nett_val
           ELSE -1*nett_val 
       END)/10000000 AS Volume
   FROM Deal where rectype = 'L' and value_date >= '01 Jul 2017' and value_date <= '31 Jul 2017' and asset_type in ('EQU','ETF','PRF','CCD','AT1')

1 个答案:

答案 0 :(得分:0)

我会评论但似乎我的名声不够高。您的示例与名称不对应的示例数据不对应。

从SQL看起来你有一个表处理列rectype,value_date,asset_type,tran_type和nett_value。在示例表中,您提供了不同的字段名称以及更少的字段。

你提到你想要按日期分组的结果,我猜“value_date”但输出只有1行,而你的样本表有2个不同的日期?

SQL还会产生4个结果列但没有日期。

根据您提供的信息,我可以建议将value_date添加到选择部分,并在查询末尾添加“GROUP BY value_date”。

我不确定为什么你有“使用NOT IN子句的销售结果列 - 因为 - 从样本数据我认为它将与('Sal')

所以我的查询可能不是你需要的,但确实使用了正确的语法:

SELECT 
    value_date
    , sum(CASE 
       WHEN tran_type in ('PUR','PURF','ISPUR','BONPUR','CONPUR','PMALL','INJVSP','CUSTTO','DPURF','ISDPUR','MFALL') THEN nett_val
       ELSE 0 END)/10000000 AS Purchase
    , sum(CASE 
       WHEN tran_type not in ('PUR','PURF','ISPUR','BONPUR','CONPUR','PMALL','INJVSP','CUSTTO','DPURF','ISDPUR','MFALL') THEN nett_val
       ELSE 0 END)/10000000 AS Sale
    , sum(CASE 
       WHEN tran_type in ('PUR','PURF','ISPUR','BONPUR','CONPUR','PMALL','INJVSP','CUSTTO','DPURF','ISDPUR','MFALL') THEN nett_val
       ELSE -1*nett_val END)/10000000 AS Net_Purchase 
    ,sum(CASE 
       WHEN tran_type not in ('DPURF') THEN nett_val
       ELSE -1*nett_val END)/10000000 AS Volume
FROM Deal 
WHERE rectype = 'L' and value_date >= '2017-01-01' and value_date <= '2017-12-31' and asset_type in ('EQU','ETF','PRF','CCD','AT1')
GROUP BY value_date

我将value_date的where过滤器更改为包括2017年全部,但该过滤器需要更改。顺便提供YYYY-MM-DD格式的固定日期更安全。