重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

mysql Client API version 3.23.49
PHP/4.4.5
で動作させようと思っています。

table
a   b
1   2
3   4
2   4
7   1
2   6
1   6

上のデータから以下のような結果を得たいのですが
table
a   b  idcount1
1   6    2
3   4    1
2   6    2
7   1    1

グループで集計をとり、その上でbに6がある場合は6その他は
bの値にNULLもしくは別の値が入るという形でいいのですが・・・
できません。

SELECT a, b, count( * ) AS idcount1
FROM table
GROUP BY a
するとはじめに読みこんだ値がbには入ってしまいます。
結果
table
a   b  idcount1
1   2    2
3   4    1
2   4    2
7   1    1

SELECT a, b, count( * ) AS idcount1
FROM table
where b=6 GROUP BY a
するとbの値ははじきますし、カウントしている意味がなくなります。
結果
table
a   b  idcount1
1   6    1
2   6    1


GROUP BY 処理前のソートを考え、from table後に oder by b=6 asc を使ったがエラー
末尾に oder by b=6 asc を使うと最初に試した値をソートするだけでした。
宜しくお願いいたします。

A 回答 (2件)

ややこしいので、tableじゃなくて、tと書きます。



SELECT a, MAX(IF(b=6,6,0)) as b1, count(*) as idcount1
FROM t GROUP BY a

でどうでしょう?

条件がよくわかりませんが、bは6が最大値なら、もっと簡単に

SELECT a, MAX(b) as b1, count(*) as idcount1
FROM t GROUP BY a

この回答への補足

下の件
ネットでフロー制御関数というのを見つけました。
本に書いていなかったということで解決です!

補足日時:2008/03/05 12:25
    • good
    • 0
この回答へのお礼

agricap 先日はお世話になりました。
前回の分に新たな命令文を組み込もうとして行き詰まったしだいです。
完璧ですね!

ひとつ疑問が。SQLポケットリファレンスを見ながらやっています。
私もsqlにphpやc言語のようなif分があれば簡単かつシンプルに解決できると思い調べたんですが、ifは
プロシージャ内で使用できる命令
oracle,sqlsever,db2,postgresqlでしか使えないと書いてありました。
なぜ!?

お礼日時:2008/03/05 12:15

特定キーでgroup by した場合は、集計関数をつかわない別キーの値は


保障されません。(自信ないけどそんな感じだったはず)
3.23系ですよね?一度テンポラリにおとすといいのではないでしょうか?
テーブル名にtableという予約語をつかうとエラーになりますので
運用には注意が必要です。

CREATE TEMPORARY TABLE t2
SELECT DISTINCT a,b
FROM `table`
WHERE b=6;
SELECT t1.a,t2.b, count( * ) AS idcount1
FROM `table` as t1
LEFT JOIN t2 ON t1.a=t2.a
GROUP BY a
    • good
    • 0
この回答へのお礼

特定キーでgroup by した場合は、集計関数をつかわない別キーの値は
保障されません。
そうですね。調べたら出来そうになかったので質問したのですが、
yambejpの回答で解決しました。
ありがとうございます。

sqlはデータベースを動かす為だけなのでできる事がシンプルですね。
こみいった事をしようとすると命令文が複雑になってしまう・・・

慣れだとは思いますが、苦手だ!

お礼日時:2008/03/05 11:31

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