質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

4回答

253閲覧

【psql】count:2つの文を1つにすることは可能でしょうか

OOO_777

総合スコア50

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2018/02/16 08:35

前提・実現したいこと

例えば下記のようなsql文がありますが、2つの文を1つにすることは可能でしょうか。

該当のソースコード

psql

1select count(*) from user where id='4' and status=1; 2select count(*) from user where id='7' and status=1;

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

unz.hori

2018/02/16 08:37

idが4または7でstatusが1のカウントを取りたいということですか?
OOO_777

2018/02/16 08:41

仰るとうりです。
OOO_777

2018/02/16 08:44

select count(*) from user where id='4' OR id='7' and status=1;
OOO_777

2018/02/16 08:44

このようなイメージでしょうか。
guest

回答4

0

あまりやらないと思いますが一応

sql

1 2select count(case when id='4' then id else null end), count(case when id='7' then id else null end) from user where status=1;

sql

1create temp table Auser (id varchar, status int); 2insert into auser values ('4',1),('4',1),('4',1),('7',1), 3 ('4',1),('4',1),('4',1),('7',1), 4 ('4',1),('4',1),('4',1),('7',1), 5 ('4',1),('4',1),('4',1),('7',1), 6 ('4',1),('4',1),('4',1),('7',0), 7 ('5',1),('5',1),('5',1),('7',0); 8INSERT 0 24 9 10select count(case when id='4' then id else null end), count(case when id='7' then id else null end) from Auser where status=1; 11 count | count 12-------+------- 13 15 | 4

これでテストしたつもり

投稿2018/02/16 10:34

編集2018/02/16 10:56
A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2018/02/16 10:37

これだと、userの件数分の表になっちゃいますね。 それぞれのサブクエリーだと1件にはなりますけど。
A.Ichi

2018/02/16 10:43 編集

status=1のユーザのみカウントされますが? ’4’と’7’以外も対象外です。 でもご質問者の意図とは違いますかね。
sazi

2018/02/16 10:44

IDがプライマリーならそうですけど、そういう前提は無いですし、プライマリーならわざわざ件数を数えるようなことするのかなって気がします。
A.Ichi

2018/02/16 10:47

プライマリでなくても有る分をカウントしていますが・・・
sazi

2018/02/16 10:56

ああ、申し訳ないです。 #ちょっと、今日は思い込みが過ぎるようです。。。 単なるcount()のみでしたね。すみません。。。
sazi

2018/02/16 11:01

それぞれの計と合計を取り出す場合は、一度に取り出せるのでそのような目的の場合には、この方法がいいですね。
OOO_777

2018/02/17 13:56

ご回答ありがとうございます。 勉強させて頂きます。
guest

0

ベストアンサー

コメントだとわかりずらいので訂正です。
合計が欲しい場合

SQL

1select count(*) from user where (id='4' or id='7') and status=1;

または

SQL

1select count(*) from user where id in('4', '7') and status=1;

別々にカウントが欲しい場合

SQL

1select count(*), id from user where (id='4' or id='7') and status=1 group by id;

または

SQL

1select count(*), id from user where id in('4', '7') and status=1 group by id;

投稿2018/02/16 09:36

unz.hori

総合スコア1057

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

OOO_777

2018/02/16 10:32

度々のご回答ありがとうございます。 無事数値の値確認できました。 ありがとうございます。
guest

0

ひょっとしてこっち?

SQL

1select id, count(*) from user 2where id in('4', '7') and status=1 3group by id

投稿2018/02/16 08:50

編集2018/02/16 09:03
sazi

総合スコア25195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

OOO_777

2018/02/16 10:32

ありがとうございます。 勉強させて頂きます。
guest

0

SQL

1select count(*) from user where id='4' or id='7' and status=1;

または

SQL

1select count(*) from user where id in('4', '7') and status=1;

投稿2018/02/16 08:45

unz.hori

総合スコア1057

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

OOO_777

2018/02/16 08:48

早速のご回答ありがとうございます。 非常に勉強になりました。
unz.hori

2018/02/16 08:57

やっぱりin句の方は怪しかったか。saziさんの回答のようにgroup by idを付ける必要がありました。
arasi

2018/02/16 08:57

上のだと idが4でCOUNTするのでstatusが1以外でもcountするので間違いです id=4 status = 0 などのデータもカウントするので間違いです
OOO_777

2018/02/16 08:59

承知いたしました。
OOO_777

2018/02/16 09:00

ありがとうございます。
unz.hori

2018/02/16 09:00

select count(*) from user where (id='4' or id='7') and status=1; ってことですか?
unz.hori

2018/02/16 09:12

あー訂正です、試してみると分かりますが、in句の方でgroup by idを付けると2レコード取得できます。合計値が欲しければgroup by idを外してください。orの方はarasiさんの指摘どおり()でくくらないと正しい値は取得できないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問