UPDATE2:如果您不关心收入值与费用值匹配的特定顺序,您可以使用这样的查询获得所需的输出
SELECT date,
MAX(CASE WHEN type = 1 THEN amount END) income,
MAX(CASE WHEN type = 2 THEN amount END) expense
FROM
(
SELECT 1 type, date, income amount, @n := IF(@g = date, @n + 1, 1) rnum, @g := date g
FROM income CROSS JOIN (SELECT @n := 0, @g := NULL) i1
UNION ALL
SELECT 2, date, expense amount, @m := IF(@f = date, @m + 1, 1) rnum, @f := date g
FROM expense CROSS JOIN (SELECT @m := 0, @f := NULL) i2
) q
GROUP BY date, rnum
输出:
| 日期 | 收入 | 费用 |
|--------------------|--------|---------|
| 2013 年 9 月 5 日 | 56000 | 68800 |
| 2013 年 9 月 5 日 | 66600 | (空) |
| 2013 年 9 月 5 日 | 50000 | (空) |
这是SQLFiddle演示
UPDATE1:用这样的查询对每天的收入和支出进行分组似乎是合乎逻辑的
SELECT a.date, i.income, e.expense
FROM
(
SELECT date
FROM income
UNION
SELECT date
FROM expense
) a LEFT JOIN
(
SELECT date, SUM(income) income
FROM income
GROUP BY date
) i
ON a.date = i.date LEFT JOIN
(
SELECT date, SUM(expense) expense
FROM expense
GROUP BY date
) e
ON a.date = e.date
输出:
| 日期 | 收入 | 费用 |
|--------------------|--------|---------|
| 2013 年 9 月 5 日 | 172600 | 68800 |
这是SQLFiddle演示
原始问题的原始答案:如果您需要如您在原始问题中所述的FULL OUTER JOIN
(超过date
列),那么这将做到
SELECT a.date, i.income, e.expense
FROM
(
SELECT date
FROM income
UNION
SELECT date
FROM expense
) a LEFT JOIN income i
ON a.date = i.date LEFT JOIN expense e
ON a.date = e.date
但是你会得到这个作为输出
| 日期 | 收入 | 费用 |
|---------------|--------|------------|
| 05 年 9 月 | 56000 | 68800 |
| 05 年 9 月 | 66600 | 68800 |
| 05 年 9 月 | 50000 | 68800 |
这是SQLFiddle演示