SQL查询来计算总数

时间:2020-01-15 12:52:20

标签: sql totals

我对SQL查询还很陌生,所以如果到目前为止我做的真的很奇怪,请放轻松:)

我有两个表-A代表收入,B代表支出:

Business_ID Income_Desc Income_Amount
1           Income A    1000
1           Income B    3000
1           Income C    2000

Business_ID Expen_Amount
1           2500

我想生成一个表格,显示每个收入金额,一个支出金额,总收入,总支出以及总收入总额的总计。

可能的话

Business_ID Income Description  Income Amount   Expenditure Amount  Total
1           Income A            1000            2500                 -
1           Income B            3000            -                    -
1           Income C            2000            -                    -
1           All Amounts         6000            2500                  3500

这是我到目前为止尝试过的

SELECT a. Business_ID, COALESCE (a.Income_Desc, 'All Amounts') AS 'Income Description', SUM(a.Income_Amount) AS 'Income Amount', SUM(b.Expen_Amount) AS Expenditure Amount', (sum(a.Income_Amount)-SUM(b.Expen_Amount)) AS 'Total'
FROM Income AS a LEFT JOIN Expenditure AS b ON a.Business_ID = b. Business_ID
GROUP BY a. Business_ID,  a.Income_Desc WITH ROLLUP

我得到的结果是这个

Business_ID Income Description  Income Amount   Expenditure Amount  Total
1           Income A            1000            2500                 -1500
1           Income B            3000            2500                 500
1           Income C            2000            2500                 -500
1           All Amounts         6000            7500                 -1500
            All Amounts         6000            7500                 -1500

是否有可能获得我上面提供的输出?您能告诉我如何实现它(或非常接近的东西)吗?

谢谢

2 个答案:

答案 0 :(得分:0)

您可以将row_number()用于join

with ie as (
      select i.business_id, i.income_desc, i.income_amount,
             e.expen_amount
      from (select i.*,
                   row_number() over (partition by business_id order by income_desc) as seqnum
            from income i
           ) i left join
           (select e.*,
                   row_number() over (partition by business_id order by expen_amount) as seqnum
            from expenditure e
           ) e
           on i.business_id = e.business_id and i.seqnum = e.seqnum
       )
select ie.*
from ie
union all
select business_id, 'Total', sum(income_amount), sum(expen_amount)
from ie
group by business_id;

答案 1 :(得分:0)

您可以在原始查询中进行子查询,仅选择企业ID不为空的值。此外,使用CASE WHEN标识那些值<0并将其替换为“-”:

SELECT x.Business_ID
     , x.`Income Description`
     , x.`Income Amount`
     , x.`Expenditure Amount`
     , x.Total
FROM
(SELECT a. Business_ID
     , COALESCE (a.Income_Desc, 'All Amounts') AS 'Income Description'
     , SUM(a.Income_Amount) AS 'Income Amount'
     , SUM(b.Expen_Amount) AS 'Expenditure Amount'
     , CASE WHEN (sum(a.Income_Amount)-SUM(b.Expen_Amount)) < 0
       THEN '-'
       ELSE (sum(a.Income_Amount)-SUM(b.Expen_Amount))
       END AS 'Total'
FROM Income AS a 
    LEFT JOIN Expenditure AS b ON a.Business_ID = b.Business_ID
WHERE a.Business_ID is not null and b.Business_ID is not null
GROUP BY a.Business_ID, a.Income_Desc WITH ROLLUP) as x
where x.Business_ID is not null

DB Fiddle