1

Sales と Expenses の 2 つのテーブルがあります。

例えば

販売:

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
4

3 に答える 3

1

を含むネストされたクエリは、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デモ

于 2012-11-24T07:19:59.293 に答える
0

必要なのは FULL OUTER JOIN です:

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は FULL OUTER JOIN をサポートしていません。

その場合、LEFT OUTER JOIN と RIGHT OUTER JOIN の UNION で FULL OUTER JOIN をシミュレートする必要があります。

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-24T07:03:26.113 に答える
0

完全外部結合が必要です。mysql がサポートしていない場合は、ここで考えられる回避策を探してください。

于 2012-11-24T07:04:47.897 に答える