0

2 つのテーブルから 1 か月あたりの合計金額を取得しようとしています。クエリは次のとおりです。

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')

受け取り金額を間違えています。クエリの修正を手伝っていただけませんか。

SQL フィッフル

4

3 に答える 3

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')
于 2013-08-02T05:58:12.873 に答える
1

@Stephen:あなたのソリューションは、 item の各行に対して 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 

CHANGE 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 
于 2013-08-02T06:33:01.567 に答える
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 
于 2013-08-03T08:19:15.690 に答える