我试图从2个表中获得每月的总金额这是我的查询
SELECT date_format(items.date, '%M %Y') as month,
COALESCE(SUM(items.amount), 0) as Rreceived,
COALESCE(SUM(issued_items.amount), 0) as Issued,
items.currency
FROM items
LEFT JOIN issued_items
ON date_format(items.date, '%Y-%m')=date_format(issued_items.date, '%Y-%m')
AND items.currency=issued_items.currency
GROUP BY date_format(items.date, '%Y-%m')
我收到的金额错了。你能帮我纠正一下这个问题。
答案 0 :(得分:2)
试试这个:
SELECT date_format(items.date, '%M %Y') as month,
COALESCE(SUM(items.amount), 0) as Rreceived,
(SELECT SUM(amount)
FROM issued_items
WHERE date_format(items.date, '%Y-%m') = date_format(date, '%Y-%m')
AND items.currency = currency
) AS Issued
FROM items
GROUP BY date_format(items.date, '%Y-%m')
答案 1 :(得分:1)
@Stephen: 您的解决方案在 items 上的每一行的 issue_items 上发出子查询,不是吗?
我认为这可能是一个更便宜的解决方案:
SELECT items.month,
items.amount as Rreceived,
issued_items.amount as Issued,
items.currency
FROM (
SELECT date_format(items.date, '%M %Y') as month,
COALESCE(SUM(items.amount), 0) as amount,
items.currency
FROM items
GROUP BY date_format(items.date, '%Y-%m')
) items
LEFT JOIN (
SELECT date_format(issued_items.date, '%M %Y') as month,
COALESCE(SUM(issued_items.amount), 0) as amount,
issued_items.currency
FROM issued_items
GROUP BY date_format(issued_items.date, '%Y-%m')
)
issued_items
ON items.month=issued_items.month
AND items.currency=issued_items.currency
更改强> IFNULL可以解决您的问题(如Oracle中的NVL)
SELECT items.month,
ifnull(items.amount,0) as Rreceived,
ifnull(issued_items.amount,0) as Issued,
items.currency
FROM (
SELECT date_format(items.date, '%M %Y') as month,
COALESCE(SUM(items.amount), 0) as amount,
items.currency
FROM items
GROUP BY date_format(items.date, '%Y-%m')
) items
LEFT JOIN (
SELECT date_format(issued_items.date, '%M %Y') as month,
COALESCE(SUM(issued_items.amount), 0) as amount,
issued_items.currency
FROM issued_items
GROUP BY date_format(issued_items.date, '%Y-%m')
)
issued_items
ON items.month=issued_items.month
AND items.currency=issued_items.currency
答案 2 :(得分:1)
添加与新http://sqlfiddle.com/#!2/9856e9/1情况相关的新答案:
为了避免排亏,我在两个表上选择了所有可能的月/货币组合,因此我可以在两个表上进行左联接。 请注意,如果工会中没有组合(2013年4月/美元),则不返回任何行!
SELECT union_items.month,
ifnull(items.amount,0) as Received,
ifnull(issued_items.amount,0) as Issued,
union_items.currency
FROM (
select
date_format(items.date, '%M %Y') as month, items.currency
FROM items
GROUP BY date_format(items.date, '%Y-%m')
UNION
select
date_format(issued_items.date, '%M %Y') as month, issued_items.currency
FROM issued_items
GROUP BY date_format(issued_items.date, '%Y-%m')
) union_items
LEFT JOIN
(
SELECT date_format(items.date, '%M %Y') as month,
COALESCE(SUM(items.amount), 0) as amount,
items.currency
FROM items
GROUP BY date_format(items.date, '%Y-%m')
) items
ON items.month=union_items.month
AND items.currency=union_items.currency
LEFT JOIN (
SELECT date_format(issued_items.date, '%M %Y') as month,
COALESCE(SUM(issued_items.amount), 0) as amount,
issued_items.currency
FROM issued_items
GROUP BY date_format(issued_items.date, '%Y-%m')
)
issued_items
ON union_items.month=issued_items.month
AND union_items.currency=issued_items.currency