问题描述
我要从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
避免过滤掉没有交易的月份。