我有两张表,销售额和费用
例如
销售额:
sales_date Amount
2012-11-01 12000.55
2012-11-03 2650.00
2012-11-03 2650.00
2012-11-03 2650.00
2012-11-07 12900.00
2012-11-07 2900.00费用:
Expense Date Amount
2012-11-03 40.00
2012-11-10 100.00
2012-11-10 1000.00
2012-11-11 10.00
2012-11-17 100.00我需要SQL查询输出为
Date Sales Expense
2012-11-01 12000.55
2012-11-03 7950.00 40.00
2012-11-07 15800.00
2012-11-10 1100.00
2012-11-11 10.00
2012-11-17 100.00发布于 2012-11-24 15:03:26
您需要的是一个完整的外部连接:
SELECT COALESCE(E.Date, S.Date) AS Date,
SUM(S.Amount) AS Sales,
SUM(E.Amount) AS Expenses
FROM Expenses AS E
FULL OUTER JOIN Sales AS S
ON E.Date = S.Date
GROUP BY COALESCE(E.Date, S.Date);这就是标准SQL;我们现在必须确定MySQL是否支持它。不幸的是,正如评论者所指出的那样,MySQL不支持完全的外部连接。
在这种情况下,您必须使用左外连接和右外连接的联合来模拟完整的外连接:
SELECT E.Date AS Date, SUM(S.Amount) AS Sales, SUM(E.Amount) AS Expenses
FROM Expenses AS E
LEFT OUTER JOIN Sales AS S
ON E.Date = S.Date
GROUP BY E.Date
UNION
SELECT S.Date AS Date, SUM(S.Amount) AS Sales, SUM(E.Amount) AS Expenses
FROM Expenses AS E
RIGHT OUTER JOIN Sales AS S
ON E.Date = S.Date
GROUP BY S.Date;发布于 2012-11-24 15:19:59
一个带有UNION ALL的嵌套查询将为您提供所需的内容;首先分别获取所有销售行和所有费用行,然后将它们GROUP到每个日期的公共行中;
SELECT date, FLOOR(SUM(s)) AS sales, FLOOR(SUM(e)) AS expense
FROM
(
SELECT sales_date AS date, amount AS s, 0 AS e FROM sales
UNION ALL
SELECT expensedate AS date, 0 AS s, amount AS e FROM expense
) AS individual_rows
GROUP BY date
ORDER BY date;如果你不想舍入,可以省略FLOOR(你的结果似乎表明你需要舍入)
SQLfiddle demo。
发布于 2012-11-24 15:04:48
您需要一个完整的外部联接。如果mysql不支持它,可以在here上查找可能的解决方法。
https://stackoverflow.com/questions/13539091
复制相似问题