0

1 か月間注文がなかった場合は、ギャップを 0 で埋める必要があります。

テーブルの例:

date         product
2010-02-01   20 
2010-03-01   10
2010-03-01   30
2010-06-01   15

私の基本的なクエリは次のとおりです。

SELECT date,SUM(orders.product) AS product
FROM orders 
GROUP BY month(date),YEAR(date)

それは次を返します:

date         product
2010-02-01   20 
2010-03-01   40
2010-06-01   15

しかし、私は必要です:

date         product
2010-02-01   20 
2010-03-01   40
2010-04-01   0
2010-05-01   0
2010-06-01   15

可能なすべての日付を含む表を作成しました。

datefield
2010-01-01  
2010-02-01  
2010-03-01 
2010-04-01  
2010-05-01  
2010-06-01  
2010-07-01  
etc...

しかし、2つに参加しようとするとうまくいきません。(編集: 最初の欠落している月でのみ機能します。)

SELECT calendar.datefield AS DATE,
IFNULL(SUM(orders.product),0) AS product
FROM orders RIGHT JOIN calendar ON (MONTH(orders.date) = MONTH(calendar.datefield)) AND (YEAR(orders.date) = YEAR(calendar.datefield)) 
WHERE (calendar.datefield BETWEEN (SELECT MIN(DATE(date)) FROM orders) AND (SELECT MAX(DATE(date)) FROM orders))
GROUP BY DATE 
4

4 に答える 4

2
ON (DATE(orders.date) = calendar.datefield) 

日付フィールドから年/月/日を抽出していますがorders.date、日付フィールドからは抽出していません。それかもしれません。

やってみます

ON (DATE(orders.date) = DATE(calendar.datefield))

また、月が欲しいので、月だけでチェックします

ON (MONTH(orders.date) = MONTH(calendar.datefield)) AND (YEAR(orders.date) = YEAR(calendar.datefield)) 

そして今、あなたは1日あたりの行ではなく、月の行だけが必要です。

于 2012-07-28T08:57:12.047 に答える
1

カレンダー テーブルを結合する必要があります。

SELECT date,SUM(orders.product) AS product
FROM orders 
GROUP BY month(date),YEAR(date)
union
select datefield AS date, '0' AS product
from calendar
于 2012-07-28T10:05:08.087 に答える
0

これは私の問題を解決しました:

SELECT date, product FROM (
SELECT date,SUM(orders.product) AS product
FROM orders 
GROUP BY MONTH(date),YEAR(date)
UNION 
select datefield AS date, '0' AS product
from calendar
WHERE (calendar.datefield BETWEEN (SELECT MIN(DATE(date)) FROM orders) AND (SELECT MAX(DATE(date)) FROM orders))
GROUP BY MONTH(date),YEAR(date)
) AS a
GROUP BY MONTH(date),YEAR(date)
ORDER BY date
于 2012-07-28T11:10:34.327 に答える
0

私のカレンダー テーブルでは、日付は「cal_date」列に保持されます。構文は PostgreSQL 用です。MySQL に簡単に適応できるはずです。

select to_char(cal_date, 'YYYY-MM') as period, sum(coalesce(product, 0))
from orders 
right join calendar c on c.cal_date = orders.date
where (
  cal_date >= (select min(date) from orders) and
  cal_date <= (select max(date) from orders)
)
group by period
order by period

to_char(cal_date, 'YYYY-MM') as period「2010-02」のような値を含む「期間」という名前の列を返します。月ごとに集計するとき、日付を返すのは好きではありません。人々を混乱させる傾向があります。

適切な結合は、月と年だけでなく、日付の値に基づく必要があります。(ちょっと考えてみてください。)

関心のある範囲の最初の月または最後の月に注文がない場合、WHERE 句は誤動作します。実際の注文ではなく、渡されたパラメーターに基づいて範囲を設定することをお勧めします。

于 2012-07-28T12:04:35.080 に答える