こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

group byを使う時に条件をつけたいです。

どう頑張っても思いどうりにDBからデータがとれず困ってます...

例えばこんなテーブルがあったら(テーブル名が"test"、カラムが"name"と"id")

table test

name | id
----------
aa | 1
aa | 1
aa | 1
bb | 1
bb | 1
aa | 0
aa | 0
cc | 0

カラム"id"が0の時は、カラム"name"のgroup byせず
カラム"id"が1の時だけ、カラム"name"のgroup byするには、どうすればいいのでしょう?

このような感じにデータを取り出したいのです。

name | id  | COUNT
----------
aa | 1 | 3
bb | 1 | 2
aa | 0 | 1
aa | 0 | 1
cc | 0 | 1

よろしくお願いします。

投稿日時 - 2011-08-06 03:08:17

QNo.6924438

困ってます

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

SET @row_no:=1;
SELECT
  name
  ,COUNT(id) AS count_id
  ,id
  ,name
  ,IF(id=1,0,@row_no:=@row_no+1) AS row_no
FROM
  `test`
GROUP BY
 row_no
 ,name

これでいかがでしょうか、、もっとスマートなsqlありそうですが(´・ω・`)

投稿日時 - 2011-08-06 04:05:17

お礼

ありがとうございました
助かりました

投稿日時 - 2011-08-06 16:56:28

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

私は下記の様に考えます。

(1) カラム"id"が0の時は、カラム"name"のgroup byせず
  SELECT  WHERE

(2) カラム"id"が1の時だけ、カラム"name"のgroup byする
  SELECT  GROUP BY  HAVING


(1)文 UNION(ALL)(2)文


各構文を参照してください。

投稿日時 - 2011-08-06 04:34:59

お礼

ご回答ありがとうございます。
問題は無事解決できました。

投稿日時 - 2011-08-06 16:54:20

ANo.3

下記のようにUNIONを使うとスマートかもですね。

select name, 1 as id, count(*) as count from test where id=1 group by name
union all
select name, id, 1 as count from test where id=0;

投稿日時 - 2011-08-06 04:13:03

お礼

tsuyshさんご回答ありがとうございます。
問題は無事解決できました。

投稿日時 - 2011-08-06 16:55:05

ANo.2

setで行に連番ふらなくてもrand()使えばなんとなく行けますね。set使いたくない場合はこっちでもいいかもです。ただ結果の保証がうーん・・・ですが。

SELECT
name
,COUNT(id) AS count_id
,id
,name
,IF(id=1,0,RAND()) AS row_no
FROM `test_3`
GROUP BY row_no,name

投稿日時 - 2011-08-06 04:11:41

お礼

mogura_198さんご回答ありがとうございます。
問題は無事解決できました。

投稿日時 - 2011-08-06 16:55:29

あなたにオススメの質問