- PR -

select countについて

投稿者投稿内容
まつじん
ベテラン
会議室デビュー日: 2005/12/02
投稿数: 54
投稿日時: 2007-02-22 16:13
現在、下記の命令でデータを取得しているのですが、WHERE句に
同じ条件が入っていてもっとスマートにならないかと思っています。
それで、自分なりに調べたのですが分かりません。
どなたか良いアドバイスを頂けませんでしょうか。

環境:postgre8.0.1
SELECT
(SELECT count(*) FROM TEST1 WHERE cd = '1' AND id = '1'),
name
FROM
TEST1
WHERE
cd = '1' AND id = '1'

結果:
---------------------
count(*) | name |
---------------------
3 | test4 |
---------------------
でっち6号
大ベテラン
会議室デビュー日: 2005/01/31
投稿数: 176
お住まい・勤務地: Kawasaki
投稿日時: 2007-02-22 17:04
集計関数+GROUP BYで個別集計になります。

SELECT COUNT(*),NAME
FROM TEST1
WHERE cd = '1' AND id = '1'
GROUP BY NAME

で、どうでしょ?
まつじん
ベテラン
会議室デビュー日: 2005/12/02
投稿数: 54
投稿日時: 2007-02-22 18:00
でっち6号さん、返答ありがとうございます。
自分もでっち6号さんのように試してみましたが、
name毎で集計されてしまいますので
この方法を諦めました。
やっている事としましてはcd=1,name=1に当てはまるものをカウントをして、
そのカウントされた数と同じ条件でname列をくっつけているというような感じなります。
KOX
大ベテラン
会議室デビュー日: 2004/08/23
投稿数: 142
投稿日時: 2007-02-22 18:12
引用:

まつじんさんの書き込み (2007-02-22 18:00) より:
やっている事としましてはcd=1,name=1に当てはまるものをカウントをして、
そのカウントされた数と同じ条件でname列をくっつけているというような感じなります。


もしかして、最初にまつじんが記述した結果ではなく、
---------------------
count(*) | name |
---------------------
3 | test4 |
3 | test4 |
3 | test4 |
---------------------
としたいと言っていますか?

#日本語が変だったので修正

[ メッセージ編集済み 編集者: KOX 編集日時 2007-02-22 18:13 ]
まつじん
ベテラン
会議室デビュー日: 2005/12/02
投稿数: 54
投稿日時: 2007-02-22 18:33
KOXさん返答ありがとうございます。

たぶん、KOXさんが言われている内容だと思います。
分かりづらくて申し訳ありません。

実際は、nameには同じ名前が無いので
----------------
count| name |
----------------
3 | test1|
3 | test2|
3 | test3|
----------------
というような感じになります。
ちなみにcountに関しては同じ数字になります。

それと、若干記述が間違っていましたので訂正します。
SELECT
(SELECT count(*) FROM TEST1 WHERE cd = '1' AND id = '1')AS count,
name
FROM
TEST1
WHERE
cd = '1' AND id = '1'

[ メッセージ編集済み 編集者: まつじん 編集日時 2007-02-22 18:36 ]
でっち6号
大ベテラン
会議室デビュー日: 2005/01/31
投稿数: 176
お住まい・勤務地: Kawasaki
投稿日時: 2007-02-22 19:23
count側の条件を結合に変更するかcdとidで集計したものとjoinすれば、
条件を設定する箇所は1つにできますが、処理コストはいずれの場合も
元のSQLより高くなると思います。

ちなみに前者の例です(Oracle10Gで動作確認)
コード:

SELECT
(SELECT count(*) FROM TEST1 wk
WHERE TEST1.cd = wk.cd
AND TEST1.id = wk.id)AS count,
name
FROM TEST1
WHERE cd = '1' AND id = '1'



countは必ずレコード数になりますよね?
結果を利用する側のプログラムで何とかしてしまう方が
「スマート」だと思いますが...

[ メッセージ編集済み 編集者: でっち6号 編集日時 2007-02-22 19:39 ]
KOX
大ベテラン
会議室デビュー日: 2004/08/23
投稿数: 142
投稿日時: 2007-02-23 11:19
でっち6号さんの方法でもよいですし、
FROM句で
カウントするselectのもありです。

select count, name from test1,(select count(*) as count xxxxx ) where xxxx
とか。

ただスマートとかどうかは別として、
同一条件なのであれば、
test1.cd = wk.cd とするよりも、
初めの投稿のようにしたほうが、
条件が一目瞭然で可読性があると思います。
忠犬
大ベテラン
会議室デビュー日: 2006/05/01
投稿数: 109
投稿日時: 2007-02-23 12:03
selectの選択式の中にselect count(*)を書くと、今回の場合は3回、select count(*)が
実行されます。fromにインラインビューとして書き、直積にする方が性能的には良い
でしょう。

2箇所に同じ条件式を書くのは、1行しか検索されないものと、複数行検索されるものを
繋げるのだから仕方ないし、その方が可読性も良いと思います。

コード:
select cnt,name
 from (select count(*) as cnt from test1 where cd='1' and id='1') as wk,test1
 where cd='1' and id='1';


スキルアップ/キャリアアップ(JOB@IT)