BROUP BY で集計し、日付で削除

このQ&Aのポイント
  • PostgreSQL 8.0.8を使用して、データをcodeでグループ化し、各codeの件数を調べる方法を教えてください。
  • また、dateが本日から30日以上前の場合は除外する条件を追加したいですが、エラーが出てうまくいきません。
  • どのようにクエリを書けば良いでしょうか?
回答を見る
  • ベストアンサー

BROUP BY で集計し、日付で削除

よろしくお願いします PostgreSQL 8.0.8です 現在 code date 1    2007-04-02 12:52:22.239818+09 1    2007-03-02 12:52:50.90313+09 2    2007-04-02 13:08:35.093001+09 2    2007-04-02 13:11:08.532232+09 というデータがあるとし これをcodeでグループ化して、codeが何件あるかを調べたいです ただし、dateが本日から30日以上前の場合は省くという条件をつけたいのですがエラーがでてうまくいきません SELECT code,COUNT(code) AS cnt FROM test GROUP BY code HAVING date(date) >= '30前の日付' どう書いたらうまくいくのでしょうか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

>エラーがでてうまくいきません どういうエラーなのか、具体的にメッセージの内容を書きましょう。 havingで集合関数(集計関数)以外を指定する場合は、その列がgroup byで指定されていなければなりません。 havingでなく、whereで指定することを考えてみてください。 SELECT code,COUNT(code) AS cnt FROM test WHERE date(date) >= '30前の日付' GROUP BY code といった感じになりましが、当初のやりたかったことと合致していますか?

SAY_MAN
質問者

お礼

ありがとうございます 出来ました >どういうエラーなのか、具体的にメッセージの内容を書きましょう。 すいません、まさに「dateをgroup byで指定されていなければなりません。」 的なエラーでした。 GROUP BYを使う場合はHAVINGを使わないといけないと思っていたのですが 違ったみたいですね おはずかしいです どうもありがとうございました

関連するQ&A

  • MySQL4でViewの代わりにできますか?

    PostgreSQLで下記のようなビューを作成し、そのビューから日付でgroupbyして日付ごとのユニーク件数を取っていました。 ---------------------------------------------- create view v_uniqcountday as select substring(datetime, 1, 8) as date, uniqid, careercd, count(*) as cnt from accesslog group by date, uniqid, careercd order by date; select date, count(*) as cnt from v_uniqcountday where (date >= xxx) and (date < xxx) group by date; ---------------------------------------------- しかし、MySQLではViewは作成できないようです。 そこでselect文のみで上記のような集計は可能でしょうか? よろしくお願いいたします。

  • Access97のクエリー(sql文)について

    [A]テーブルに[CODE.DATE.CHK]とフィールドがあります 内容は、 [CODE][DATE][CHK] 01.2007/06/01.0 01.2007/06/10.1 01.2007/06/11.1 02.2007/05/01.0 02.2007/05/10.1 と、します。 結果を 01.3.2 02.2.1  と、したいのです。 つまり、[DATE]の行数と、[CHK]が1の件数が とりたいのです。 SELECT A.CODE, Count(A.DATE) AS CNT FROM A GROUP BY A.CODE; と、すれば、[DATE]の行数はとれます。 [CHK]が1の件数の取り方が解りません。 宜しくお願い致します。

  • GROUP BY句の集計について

    はじめまして。 いろいろ調べて、何度試しても思うように 結果がでなかったので、投稿させて頂きました。 グループの集計をしてるのですが、 何個のグループがあるのかカウントしたいのです。 aaa bbb 110 a 110 b 111 c 112 d というDBに select aaa, bbb, count(*) as cnt from database GROUP BY aaa ORDER BY aaa だとそのグループ内の該当レコード数がカウントされてしまいます。 上記の例だとグループ数が“3”と結果を返すようにしたいのです。 では。宜しくお願いします。

    • ベストアンサー
    • MySQL
  • 集計関数の合計について

    お世話になります。 SQLSever2005を使用しています。 Count(*)で月毎のデータ件数を集計し、またその結果を出力するSQLを考えております。 SELECT  (SELECT Count(*) FROM TBL_TEST T1 WHERE T1.T_DATE>='2005/01/01' AND T1.T_DATE=<'2005/01/31') AS CNT_1,  (SELECT Count(*) FROM TBL_TEST T2 WHERE T2.T_DATE>='2005/02/01' AND T2.T_DATE=<'2005/02/31') AS CNT_2,   (SELECT Count(*) FROM TBL_TEST T3 WHERE T3.T_DATE>='2005/03/01' AND T3.T_DATE=<'2005/03/31') AS CNT_3,   (CNT_1+CNT_2+CNT_3) AS TOTAL_CNT ・・・・・・・・・・・・ (★)  FROM TBL_TEST T  WHERE ・・・・・・・・・ 結果(★)のところで『CNT_1は無効です』というエラーになってしまいます。 ちなみにAccessではエラーにならずに結果を出力していました。 上記のSQL文はどのように修正すればよろしいでしょうか?

  • SQLでグループ化した結果の件数を求めるには?

    下記のようなグループ化した結果を表示するSQL文を作りました。 SELECT メーカコード FROM 部品表 GROUP BY メーカコード, 部品番号 HAVING ((部品番号)="BUHIN1") これを実行するとちゃんと結果が出るのですが、その結果の件数を求めるにはどのようなSQL文を追加すれば宜しいのでしょうか? COUNT文を使うと出来そうなのですが、 SELECT メーカコード, COUNT(メーカコード) AS CNT FROM 部品表 GROUP BY メーカコード, 部品番号 HAVING ((部品番号)="BUHIN1") とやるとメーカコードの個別件数が表示されてしまいます。 どうぞよろしくお願いします。

  • in (サブクエリ) わかんない

    table hh; +------+ | id | +------+ | 1 | | 2 | | 3 | | 2 | | 1 | | 1 | +------+ select id,count(*) as cou from hh group by id having count(*) in (1,2,3); こいつはOK select id,count(*) as cou from hh group by id having count(*) in (select count(*) from hh group by id); こいつはダメ 違いはなんですか、教えて下さい

  • SQL count 別名を条件に使用

    いつもお世話になっております。 標題についてご教授頂きたく質問させて頂きました。 [SQL} select A, B, count(*) as cnt from product where A=1 and cnt > 2 group by A order by cnt desc とこのようにSQLを記述して実行したのですが、 cnt>2でエラーが出ます。 order by には count の別名を使用できるのですが、 where句やHAVINGでは使えません。 この場合 cont(*)>2 またはcount(項目名)>2 としなければならないのでしょうか

  • アクセス 今日の日付の個数のみクエリで表示したい

    テーブル1に「日のみ」フィールドを作成し 日のみ 2009/06/28 2009/06/28 2009/06/27 としました。 新規に選択クエリを作成し SELECT Count(テーブル1.日のみ) AS 日のみのカウント FROM テーブル1 HAVING (((Count(テーブル1.日のみ)) Between Date() And Date()+1)); としたのですが、 0が返ってきます。 SELECT Count(テーブル1.日のみ) AS 日のみのカウント FROM テーブル1; だと3が返ってきます。 どうすれば今日の日付のみをカウントできるのでしょう? ご教授よろしくお願い致します。

  • クロス集計での order by句の使い方

    下記の order byの部分を年月日でなく合計件数順に並べ変えたいのですが、Count(氏名)を入れると「 order by句で集計関数は使えません」のようなメッセージが出ます。(access2000) 何か良い方法はないでしょうか。 TRANSFORM Count(氏名) AS 氏名のカウント SELECT 年月日, Count(氏名) AS 合計件数 FROM 日誌 GROUP BY 年月日 ORDER BY 年月日 PIVOT 区分; #access素人です。

  • MySQLで対象期間を決め集計しランキングする方法

    MySQLの初心者ですが、対象期間で集計を行いランキング付けし任意の上位何位までを抽出する方法について教えてください。 全データから集計後上位5位を選ぶ場合・・同順有り select x.`品名`,x.kei,(select count(*)+1 from (select `品名`,sum(`金額`) as kei from uriage group by `品名`) y where x.kei<y.kei ) as rank from (select `品名`,sum(`金額`) as kei from uriage group by `品名`) x having rank <= 5 order by rank といろいろ参考にしてで出来ましたが。任意の対象期間(日付)を設定して実行するSQL文が思いつきません。どこに期間を挿入するのか・・・悪あがきで思い付いた方法として CREATE OR REPLACE VIEW uriage_01 AS SELECT `品名`,SUM(`金額`) AS `金額` FROM uriage WHERE `日付` BETWEEN "2001/01/01" AND "2001/01/31" GROUP BY `品名` で任意期間の集計結果のビューを作りそのビューから select r1.`品名` as `品名`, r1.`金額` as p, count(r2.`金額`)+1 as rank from uriage_01 as r1 left join uriage_01 as r2 on r1.`金額` < r2.`金額` group by r1.`品名` having rank <= 5 order by rank と手間の掛かる方法です。単純に5行だけに限定ならorder by `金額`Limit 5 にすれば良いだけですけど・・・同順があるとどうすれば良いのかと思考停止状態です。尚、当方は、MySQLの勉強を始めたばかりにですので宜しくお願いいたします

    • ベストアンサー
    • MySQL