2017-05-26 6 views
0

会社のID、日付、番号をテーブルから選択したいのですが、このクエリでは月が0の会社はありません。ここ毎月の選択方法値がない場合

クエリである:

SELECT c.name, date_format(e.created, '%y_%m') AS date, count(*) 
FROM company c 
JOIN edited e 
on c.id=e.company_id AND e.created >='2016-12-13 00:00:00' AND e.created <='2017-05-20 00:00:00' 
GROUP BY c.id, date 

この4 16_12 2 4 17_01 4 4 17_04 2 4 17_05 2 ような結果のいくつか17_03(月)なし。どのように17_03を0で表示できますか?

+0

サンプルデータと予想される出力だけでなく、関連するテーブルのスキーマも提供できますか? –

+0

私は3つのテーブルを持っています。会社(id 1、名前a/id 2、名前a/id 3、名前c)、編集済み(id 1、send_id 1、作成された2017-01-01/id2、send_id4、2017-02 (id1、company_id1、created2017-01-01/id2、company_id1、created2017-02-02/id3、company_id 1、created2017-05-01/id4、company_id)を送信します。 1、created2017-02-01/id5、company_id2、created2016-12-01/id6、company_id2、created2017-02-22) –

+0

コメントを追加すると書式が変更されました。編集されたテーブルの場合、毎月のデータがないかもしれませんし、毎月のデータが送信テーブルに含まれているかわかりません。どのようにして毎月の値を選択することができますか、価値のない何ヶ月間でも、それは次のように表示されます:2017-04 0(カウント列の下にあるセル) –

答えて

0

結合がON句の値に一致しない場合、結合ではタプルが返されず、結果として行がカウントされません。あなたが企業や日付の固定セットを持っている場合は、UNION文を使用して手動で値を設定できます。

(SELECT 'company_name1', 'date1', COUNT(*) 
FROM company c 
JOIN edited e 
on c.id=e.company_id AND e.created >='2016-12-13 00:00:00' AND e.created <='2017-05-20 00:00:00') 
UNION 

(SELECT 'company_name2', 'date2', COUNT(*) 
FROM company c 
JOIN edited e 
on c.id=e.company_id AND e.created >='2016-12-13 00:00:00' AND e.created <='2017-05-20 00:00:00') 

#and make this for companies that not will return zero at count 
UNION 
(SELECT c.name, date_format(e.created, '%y_%m') AS date, count(*) 
FROM company c 
JOIN edited e 
on c.id=e.company_id AND e.created >='2016-12-13 00:00:00' AND e.created <='2017-05-20 00:00:00' 
GROUP BY c.id, date) 
0
SELECT c.id 
    , ym.y 
    , ym.m 
    , count(e.created) cnt 
    FROM (SELECT @startDate := date_add(@startDate, interval 1 month) date 
       , year(@startDate) y 
       , month(@startDate) m 
      FROM HugeTable 
      JOIN (SELECT @startDate := '2016-11-01' 
         , @endDate := '2017-05-01' 
       ) months 
      WHERE @startDate < @endDate 
     ) ym 
    LEFT JOIN edited e 
     ON year(e.created) = ym.y 
     AND month(e.created) = ym.m 
    LEFT JOIN company c 
     ON c.id = e.company_id 
    GROUP BY ym.y 
     , ym.m 
     , c.id 

月の数を表示するようHugeTableレコードの十分な数の任意のテーブルすることができ。

+0

回答ありがとうございます。巨大なテーブルにはすべてのレコードが必要ですが、私はそのようなテーブルを持っていません。他のクエリが機能することはありますか? –

+0

**編集した**をHugeTableとして使用しても問題ありません。私の推測。 – Sal

+0

特定の状況下では、実行時に行を作成するよりパフォーマンスが高い可能性があるため、日付表を持つことは夢中ではありません。 [こちら](https://stackoverflow.com/questions/14105018/generating-a-series-of-dates)を確認してください。 – Sal

関連する問題