2017-10-12 13 views
0

レポートを保存するテーブルがあるデータベースがあります。各レポートには、レポートが作成されるたびに設定される日付(年月日)があります。"where"を使用してデータベースの "count"を取得する

多くのテストの後、私は何か作業をしましたが、うまく動作しません。

最初の日付(年 - 月 - 日)から最終日(年 - 月 - 日)までの毎月のレポートの量を取得したいと思います。しかし、私はどのようにそれを完了するためにはよく分かりません。

これは私が今使っているMySQLの文である:

SELECT meses.month id_mes, count(re_fecha) total 
     FROM 
     (
       SELECT 1 AS MONTH 
        UNION SELECT 2 AS MONTH 
        UNION SELECT 3 AS MONTH 
        UNION SELECT 4 AS MONTH 
        UNION SELECT 5 AS MONTH 
        UNION SELECT 6 AS MONTH 
        UNION SELECT 7 AS MONTH 
        UNION SELECT 8 AS MONTH 
        UNION SELECT 9 AS MONTH 
        UNION SELECT 10 AS MONTH 
        UNION SELECT 11 AS MONTH 
        UNION SELECT 12 AS MONTH 

     ) as meses 

LEFT JOIN reportes ON month(re_fecha) = meses.MONTH 
WHERE re_fecha BETWEEN '2017-01-01' AND '2017-08-31' 
GROUP BY meses.MONTH, monthName(re_fecha) 

これは私がMySQLの文で取得しています以下の結果である:

id_mes | total 
--------------- 
    04 | 15 
    05 | 5 
    06 | 15 
    07 | 2 

Iこれが何らかの形で役立つかどうかは分かりませんが、私が "re_fechas ..."を使わないと、私たちが探しているものに近い結果が得られます:

id_mes | total   
-------------   
01  | 0   
02  | 0   
03  | 0   
04  | 15    
05  | 5 
06  | 15 
07  | 2 
08  | 6 
09  | 0 
10  | 0 
11  | 0 
12  | 0 

そして最後に、私が見てみたい:私は文を使用する場合は、「

  1. id_mes  | total    
    -------------------  
    01-2017  | 0    
    02-2017  | 0    
    03-2017  | 0    
    04-2017  | 15 
    05-2017  | 5 
    06-2017  | 15 
    07-2017  | 2 
    08-2017  | 6 
    

    は、私はそれが今どのように動作するかの2つの問題を抱えています指定された日付のレポートが0の月は表示されません。私が「どこで」使っていないなら、私はそれらをほしいと思う方法でほとんど物事を得るが、私が望む日付の範囲ではない。

  2. 私が持っていたもう1つの問題は、月の年を取得したいということです(上記のコードブロックで示されているように)。

私はデータベースを提供できるかどうかわからないんだけど、あなたはそれが役立つだろうと思うなら、私に知らせて、これはすべてを理解するのに十分な情報であると思います。

答えて

0

あなたはほとんどそれを持っています。

WHERE句にOR re_fecha IS NULLを追加すると、ほとんどあなたが望むものが得られます。

私はあなたを助けることができる別の解決策を思い付いた:あなたは、その後、MySQLを使用していなかった場合は

aMonth total 
01-2017 0 
02-2017 0 
03-2017 0 
04-2017 15 
05-2017 5 
06-2017 0 
07-2017 2 
08-2017 0 

SELECT meses.aMonth aMonth, COUNT(re_fecha) total 
FROM (
    -- Listing all months in period 
    SELECT DATE_FORMAT(m1, '%m-%Y') aMonth 
    FROM (
    -- Range limit: about 21 years 
    SELECT 
    ('2017-01-01' - INTERVAL DAYOFMONTH('2017-01-01')-1 DAY) +INTERVAL m MONTH as m1 
    FROM (
     SELECT @rownum:[email protected]+1 m FROM 
     (SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t1, 
     (SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t2, 
     (SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t3, 
     (SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t4, 
     (SELECT @rownum:=-1) t0) d1 
    ) d2 
    WHERE m1 <= '2017-08-31' 
    ORDER BY m1) meses 
LEFT JOIN reportes ON DATE_FORMAT(re_fecha, '%m-%Y') = meses.aMonth 
WHERE re_fecha BETWEEN '2017-01-01' AND '2017-08-31' 
OR re_fecha IS NULL 
GROUP BY meses.aMonth; 

テストそれ:http://sqlfiddle.com/#!9/d21de6/27

出力例LEFT JOINの代わりにFULL OUTER JOINを使用できます。

この解決策は21年に制限されています。最初の日付だけを1970年に変更してみてください。
月額を増やす場合は、必要に応じて(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) tn,を追加してください。

参考と便利なリンク:

MySQL monthly Sale of last 12 months including months with no Sale
How to get a list of months between two dates in mysql
How to do a FULL OUTER JOIN in MySQL?

+0

@Strawberryこれが面倒であってもOPは数ヶ月の変数の範囲を必要としない場合、それはかなり簡単です。そして、 'FULL OUTER JOIN'が必要ですが、MySQLでは持っていないので、LEFT JOINでエミュレートする必要があります。私はこの問題にアプローチする別の方法を追加して私の答えを更新しました。 – MiguelKVidal

+0

Gotcha - 私の間違い。 – Strawberry

+0

これは完全に機能します!私たちはそれを試して実装しました。私たちが望んでいるように動いています。私はその返事を感謝します。君たちありがとう。 –

0

クエリで、WHEREをANDに変更してみます。

関連する問題