sql查询中的Sum函数

时间:2016-11-02 17:49:35

标签: informix

我有以下查询:

SELECT 
     cc.chain_desc as chain_desc 
    ,cc.chain_id as chain_id 
    ,COUNT(distinct t.trans_id) as TranCount
FROM TRANSACTION AS t 
LEFT OUTER JOIN location AS l 
ON t.location_id = l.location_id 
LEFT OUTER JOIN trans_line AS tl 
ON t.trans_id = tl.trans_id 
LEFT OUTER JOIN contract as c 
ON t.contract_id = c.contract_id 
LEFT OUTER JOIN chain_desc as cc 
ON l.chain_id = cc.chain_id 
WHERE 
t.loc_country = 'U' 
AND c.issuer_id IN (156966,166203) 
AND t.trans_date >= '2016-10-01 00:00' 
and t.trans_date < '2016-10-31 00:00'
AND tl.cat NOT IN ('DEF','DEFD','DEFC') 
GROUP BY cc.chain_desc, cc.chain_id 
ORDER BY cc.chain_desc, cc.chain_id

执行上述查询时,给出了以下结果:

enter image description here

我需要最后一列“trancount”的总和,这将是490.我尝试更改查询如下:

SELECT 
     cc.chain_desc as chain_desc 
    ,cc.chain_id as chain_id 
    ,COUNT(distinct t.trans_id) as TranCount
    ,SUM(distinct t.trans_id)as TransSum
FROM TRANSACTION AS t 
LEFT OUTER JOIN location AS l 
ON t.location_id = l.location_id 
LEFT OUTER JOIN trans_line AS tl 
ON t.trans_id = tl.trans_id 
LEFT OUTER JOIN contract as c 
ON t.contract_id = c.contract_id 
LEFT OUTER JOIN chain_desc as cc 
ON l.chain_id = cc.chain_id 
WHERE 
t.loc_country = 'U'
AND c.issuer_id IN (156966,166203) 
AND t.trans_date >= '2016-10-01 00:00' 
and t.trans_date < '2016-10-31 00:00'
AND tl.cat NOT IN ('DEF','DEFD','DEFC')
GROUP BY cc.chain_desc, cc.chain_id 
ORDER BY cc.chain_desc, cc.chain_id

但我没有得到预期的结果。对transcount列进行求和的正确方法是什么?。

2 个答案:

答案 0 :(得分:2)

== EDITED VERSION == 尝试(在SQL Server中):

SELECT 
     chain_desc
    ,chain_id
    ,TranCount
    ,SUM(TranCount) OVER (PARTITION BY 1) as TransSum
    (
        SELECT 
             cc.chain_desc as chain_desc 
            ,cc.chain_id as chain_id 
            ,COUNT(distinct t.trans_id) as TranCount
        FROM TRANSACTION AS t 
        LEFT OUTER JOIN location AS l 
        ON t.location_id = l.location_id 
        LEFT OUTER JOIN trans_line AS tl 
        ON t.trans_id = tl.trans_id 
        LEFT OUTER JOIN contract as c 
        ON t.contract_id = c.contract_id 
        LEFT OUTER JOIN chain_desc as cc 
        ON l.chain_id = cc.chain_id 
        WHERE 
        t.loc_country = 'U' 
        AND c.issuer_id IN (156966,166203) 
        AND t.trans_date >= '2016-10-01 00:00' 
        and t.trans_date < '2016-10-31 00:00'
        AND tl.cat NOT IN ('DEF','DEFD','DEFC') 
        GROUP BY cc.chain_desc, cc.chain_id 
    ) as a
    ORDER BY chain_desc, chain_id

并删除GROUP BY

答案 1 :(得分:0)

SELECT 
     cc.chain_desc as chain_desc 
    ,cc.chain_id as chain_id 
    ,COUNT(distinct t.trans_id) as TranCount
FROM TRANSACTION AS t 
LEFT OUTER JOIN location AS l 
ON t.location_id = l.location_id 
LEFT OUTER JOIN trans_line AS tl 
ON t.trans_id = tl.trans_id 
LEFT OUTER JOIN contract as c 
ON t.contract_id = c.contract_id 
LEFT OUTER JOIN chain_desc as cc 
ON l.chain_id = cc.chain_id 
WHERE 
t.loc_country = 'U' 
AND c.issuer_id IN (156966,166203) 
AND t.trans_date >= '2016-10-01 00:00' 
and t.trans_date < '2016-10-31 00:00'
AND tl.cat NOT IN ('DEF','DEFD','DEFC') 
GROUP BY GROUPING SETS ((cc.chain_desc, cc.chain_id), ())
ORDER BY cc.chain_desc, cc.chain_id

按分组集分组允许您进行多级聚合,那些未聚合的值将为Reuther NULL

如果MySQL ......

,那么你需要使用

或perhpas汇总

SELECT 
     cc.chain_desc as chain_desc 
    ,cc.chain_id as chain_id 
    ,COUNT(distinct t.trans_id) as TranCount
FROM TRANSACTION AS t 
LEFT OUTER JOIN location AS l 
ON t.location_id = l.location_id 
LEFT OUTER JOIN trans_line AS tl 
ON t.trans_id = tl.trans_id 
LEFT OUTER JOIN contract as c 
ON t.contract_id = c.contract_id 
LEFT OUTER JOIN chain_desc as cc 
ON l.chain_id = cc.chain_id 
WHERE 
t.loc_country = 'U' 
AND c.issuer_id IN (156966,166203) 
AND t.trans_date >= '2016-10-01 00:00' 
and t.trans_date < '2016-10-31 00:00'
AND tl.cat NOT IN ('DEF','DEFD','DEFC') 
GROUP BY cc.chain_desc, cc.chain_id with Rollup 
ORDER BY cc.chain_desc, cc.chain_id