dポイントプレゼントキャンペーン実施中!

どう頑張っても思いどうりに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

よろしくお願いします。

A 回答 (4件)

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ありそうですが(´・ω・`)
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/08/06 16:56

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



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

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


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


各構文を参照してください。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/08/06 16:54

下記のように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;
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/08/06 16:55

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
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/08/06 16:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!