2016-10-14 2 views
2
のMySQLで

PostgreSQLのクエリを取得1年以内ヶ月ごとにカウントする

SELECT y, m, Count(users.created_date) 
    FROM (
     SELECT y, m 
     FROM 
     (SELECT YEAR(CURDATE()) y UNION ALL SELECT YEAR(CURDATE())-1) years, 
     (SELECT 1 m UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 
      UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 
      UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12) months) ym 
     LEFT JOIN users 
     ON ym.y = YEAR(FROM_UNIXTIME(users.created_date)) 
      AND ym.m = MONTH(FROM_UNIXTIME(users.created_date)) 
    WHERE 
     (y=YEAR(CURDATE()) AND m<=MONTH(CURDATE())) 
     OR 
     (y<YEAR(CURDATE()) AND m>MONTH(CURDATE())) 
    GROUP BY y, m; 

MySQLの出力

+------+----+----------------------+ 
| y | m | Count(users.created) | 
+------+----+----------------------+ 
| 2012 | 5 |     5595 | 
| 2012 | 6 |     4431 | 
| 2012 | 7 |     3299 | 
| 2012 | 8 |     429 | 
| 2012 | 9 |     0 | 
| 2012 | 10 |     3698 | 
| 2012 | 11 |     6208 | 
| 2012 | 12 |     5142 | 
| 2013 | 1 |     1196 | 
| 2013 | 2 |     10 | 
| 2013 | 3 |     0 | 
| 2013 | 4 |     0 | 
+------+----+----------------------+ 

** PostgreSQLでQUERY **

SELECT to_char(created_date, 'MM'), 
     count(id) 
FROM users 
WHERE created_date > 
     date_trunc('month', CURRENT_DATE) - INTERVAL '1 year' 
GROUP BY 1 

POSTGRESQL出力 postgresql output

私は、mysql出力のようにpostgresqlの出力を取得する方法を知っているかもしれません。 1年間のデータ内の今月の結果を取得する必要があります。

+1

まあ、データそのものは違うようですが、それ以外の問題は何ですか? – Mureinik

+0

あなたのMySQLクエリは指定した出力を生成していません。カウント0の行を出力することは不可能です。 –

+0

@GordonLinoff sry gordon。今私はmysqlのクエリを変更します。 – boopathi008

答えて

2

私はそれはあなたがgenerate_seriesを使用することができる場合と、左にデータを使用してテーブルの上に参加している場合は、カウントが0である行あなたが探しているものと仮定している:

SELECT to_char(i, 'YY'), to_char(i, 'MM'), 
     count(id) 
    FROM generate_series(now() - INTERVAL '1 year', now(), '1 month') as i 
    left join users on (to_char(i, 'YY') = to_char(created_date, 'YY') 
         and to_char(i, 'MM') = to_char(created_date, 'MM') and login_type = 1) 
    GROUP BY 1,2; 
+0

はい、 "group by 1"の代わりに "group by 1,2"する必要があります。Olaf、固定応答 –

+0

あなたの答えをありがとう。 :) – boopathi008

+0

私はどこの条件を使用していないときに動作します。私は 'where login_type = 1'を追加しています。その時間は0より大きなカウント値しか表示しません – boopathi008

関連する問題