从SQL中的子查询获取每月总交易量

问题描述

我要从shop1表和shop2表中获取每月的total_tender总金额,并从付款表中获取每月的pay_amount总金额,这是一个挑战。 并且如果该月的付款没有价值,则应显示为零。

shop1
--------------------------------------------------------
| trans_id  | amount_tendered  |     trans_date        |
--------------------------------------------------------
|   1       |    10.00         |  2020-09-03 06:09:55  |
|   2       |    15.00         |  2020-08-01 10:19:01  |
--------------------------------------------------------

shop2
--------------------------------------------------------
| trans_id  | amount_tendered  |     trans_date        |
--------------------------------------------------------
|   1       |    30.00         |  2020-09-01 16:09:55  |
|   2       |    15.00         |  2020-09-11 11:19:01  |
--------------------------------------------------------

Payments
------------------------------------------------------------
| payments_id  | payment_amount    |   payment_date        |
------------------------------------------------------------
|   1          |    100.00         |  2020-09-01 16:09:55  |
|   2          |    105.00         |  2020-09-11 11:19:01  |
------------------------------------------------------------

SELECT t1.yr,t1.mnth,ifnull(t2.total_trans,0),ifnull(t3.payments,0) FROM
(SELECT YEAR(trans_date) as yr,MONTHNAME(trans_date) as mnth,FROM shop1
GROUP BY YEAR(trans_date),MONTHNAME(trans_date)
ORDER BY YEAR(trans_date),MONTHNAME(trans_date)) as  t1

LEFT JOIN (
SELECT( 
        (SUM(amount_tendered)  FROM shop1 GROUP BY YEAR(trans_date),MONTHNAME(trans_date)+
        (SUM(amount_tendered)  FROM shop2 GROUP BY YEAR(trans_date),MONTHNAME(trans_date)
        ) as 'total_trans'
)as t2
LEFT JOIN (
SELECT SUM(payment_amount )  FROM transactions GROUP BY YEAR(payment_date),MONTHNAME(payment_date) as payments
)as t3

预期结果

------------------------------------------------------------
|    yr      |    mnth    |   total_trans    |   payments  |
------------------------------------------------------------
|   2020     |   August   |    15.00         |    0.00     |
|   2020     |   September|    55.00         |  105.00     |
------------------------------------------------------------

错误:第4行“ FROM交易GROUP BY YEAR(transaction_date),MONTHNAME(transaction_date)”附近的语法错误

解决方法

通常,您将在两个单独的子查询中计算每月总和,然后将结果合并。

我不喜欢每个商店有一张桌子:拥有几列相同的桌子通常表示设计问题。在这里,我们使用union all在汇总之前从两个表中收集数据。

select t.*,p.payments
from (
    select year(trans_date) yr,monthname(trans_date) mnth,sum(amount_tendered) total_trans
    from (
        select trans_date,amount_tendered from shop1
        union all
        select trans_date,amount_tendered from shop2
    ) t
    group by year(trans_date),monthname(trans_date)
) t
left join (
    select year(payment_date) yr,monthname(payment_date) mnth,sum(payment_amount) payments
    from payments 
    group by year(payment_date),monthname(payment_date)
) p on p.yr = t.yr and p.mnth = t.mnth

left join避免过滤掉没有交易的月份。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...