3

私は比較的初心者で、これと長い間戦ってきました - 誰でも助けてください!

さまざまな種類の開発に関する問い合わせ (dev_enquiry) を受け取るテーブルがあり、開発ごとに 1 日あたりの問い合わせ数を示す動的グラフを作成しています。日付の列を保持するカレンダーテーブルと結合して、問い合わせがないときに0の値を取得できるようにしました。

このSQLは私が望むものを正確に提供しますが、それはすべての開発のためのものです

SELECT    calendar.datefield AS DATE, COUNT(de_id) AS enquiries
FROM      `calendar`  
LEFT JOIN dev_enquiry ON DATE(dev_enquiry.de_date_created) = calendar.datefield)
WHERE     calendar.datefield BETWEEN (
                                       SELECT MIN(DATE(de_date_created)) 
                                       FROM   dev_enquiry
                                      ) 
      AND (SELECT MAX(DATE(de_date_created)) FROM dev_enquiry)
GROUP BY  DATE 
ORDER BY  DATE DESC

2012-11-08      3
2012-11-07      0
2012-11-06      2
2012-11-05      1
2012-11-04      3

開発の種類によって結果を除外したいのですが、その特定の開発についてその日に問い合わせがない場合は、null 値を保持したままにします。

次は結果をフィルター処理しますが、null 値は提供しません。

SELECT  cal.datefield AS DATE, COUNT(t.de_id)  AS  enquiries
  FROM (
SELECT * FROM dev_enquiry as d LEFT JOIN calendar as c ON (DATE(d.de_date_created) = c.datefield) 
WHERE     d.de_dev_name = 'Green') as t
LEFT JOIN calendar as cal ON (cal.datefield = DATE(t.de_date_created)) 
 WHERE (cal.datefield BETWEEN (SELECT   MIN(DATE(t.de_date_created)) 
FROM dev_enquiry) AND (SELECT MAX(DATE(de_date_created)) FROM dev_enquiry)) 
GROUP BY DATE ORDER BY  DATE  DESC


2012-11-08      1
2012-11-06      2
2012-11-05      1
2012-11-04      1

2012-11-07 の結果がありません

4

2 に答える 2

2

ここでの秘訣は、完全なカレンダー テーブルを使用してクエリを開始し、不完全な (数日が欠落している) サマリー テーブルを左結合することです。IFNULL(null) 結果を 0 に変換することにも注意してください。

     SELECT cal.datefield AS date, 
            IFNULL(s.enquiries, 0) AS enquiries
       FROM calendar as cal
  LEFT JOIN (
           SELECT count(*) enquiries,
                  de_date_created
             FROM dev_enquiry
            WHERE de_dev_name = 'Green'
         GROUP BY de_date_created
         ) s on s.de_date_created = cal.datefield
   WHERE cal.datefield 
            BETWEEN (SELECT MIN(de_date_created) FROM dev_enquiry)
                AND (SELECT MAX(de_date_created) FROM dev_enquiry)
   ORDER BY datefield DESC

これがSQLフィドルです。 http://sqlfiddle.com/#!2/2db68/12/0

于 2012-11-09T15:07:29.240 に答える
1

質問を誤解しているのかもしれません。なぜならAND de_dev_Name = 'Green'、最初のクエリの例で左の結合に a を追加してみませんか?

SELECT    calendar.datefield AS d, COUNT(dev_enquiry.de_id) AS enquiries
FROM      calendar
LEFT JOIN dev_enquiry ON (dev_enquiry.de_date_created = calendar.datefield AND de_dev_name = 'Green')
WHERE     calendar.datefield BETWEEN
          (SELECT MIN(DATE(de_date_created)) FROM dev_enquiry)
      AND (SELECT MAX(DATE(de_date_created)) FROM dev_enquiry)
GROUP BY  d
ORDER BY  d DESC
于 2012-11-09T15:30:07.503 に答える