简体   繁体   English

用于计算总计的 SQL 查询

[英]SQL query to calculate totals

I'm quite new to SQL querying so please go easy on me if what I've done so far is really odd :)我对 SQL 查询很陌生,所以如果我到目前为止所做的事情真的很奇怪,请对我放轻松:)

I have two tables - A for Income and B for Expenditure:我有两个表 - 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

I'd like to produce a table that shows each of the income amounts, the one expenditure amount, the total income, the total expenditure and a Grand Total of total income-total expenditure.我想制作一个表格,显示每个收入金额,一个支出金额,总收入,总支出和总收入-总支出的总计。

Something like this if possible如果可能的话像这样

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

This is what I've tried so far这是我迄今为止尝试过的

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

The result I'm getting is this我得到的结果是这样的

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

Is it possible to get an output like the one I provided above?是否有可能获得像我上面提供的那样的输出? Could you show me how to achieve it (or something very close) please?你能告诉我如何实现它(或非常接近的东西)吗?

Thanks谢谢

You can use row_number() for the join :您可以使用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;

You could make a sub query out of your original query and only select values where the business ID is not null.您可以从原始查询中创建子查询,并且只选择业务 ID 不为空的值。 Furthermore, use CASE WHEN to identify those values < 0 and replace it with "-":此外,使用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数据库小提琴

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM