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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

4回答

2569閲覧

【MySQL】COUNT(*) した値がゼロ以上ならそのままカウント値を出す、ゼロ以下なら’NG’と出力可能か?

low_guy_man

総合スコア13

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

3クリップ

投稿2017/10/12 13:10

SQL一般の話となりますが、当質問ではMySQLを主軸に質問させていただきます。

###前提・実現したいこと

【目標】下表の通りのSQL結果を出力。
COUNT値を直接評価し、正数ならそのまま出力し
ゼロ以下であれば固定文字「NG」を出します。

列1列2COUNT値
aさん001 COUNT値(←count(*)>0はそのまま出す ) 
bさん002 "NG"(←count(*)<=0は固定文字'NG'と出す) 
cさん003 ・・・同じく 

###試したこと
一気に畳みかけずに、エラーが出ないように段階的に条件を追加しましたが
SQL文法エラーとなったりしています。

上表の例では、現在は下記SQLを仮定しています。

SQL

1SELECT1,2,(COUNT(*)) AS COUNT値 2FROM テーブル 3GROUP BY1,2

上記「COUNT(*)」の箇所を

SQL

1CASE WHEN COUNT(*) >0 THEN ??? ELSE 'NG' END

という流れを考えてました。
上記の「???」がどうなるのかが悩んでおります。

最終目標としては上記「前提・実現したいこと」でお伝えした通りの形式ですが
そもそも「CASE文の組み方がおかしい」のか、「CASE以外の方法が思いつかない」のか
いずれか一つと考えております。

皆さまでしたら、どのような攻め方をお考えになるかお聞かせください。

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

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

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

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

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

guest

回答4

0

ベストアンサー

group by 処理の場合、理論上「count(*)が0以下に集計される」ことはないので
命題自体が達成できません

追記

一応サンプル付けておきます
count(*) が0以下にならないのを理解しないことには先に進まないかと

SQL

1create table tbl(col1 varchar(10),col2 varchar(10),col3 int); 2insert into tbl values 3('A','X',10), 4('A','X',15), 5('A','X',12), 6('A','Y',20), 7('B','Y',35), 8('C','X',10), 9('C','X',11), 10('C','Z',8);

単純に集計

SQL

1select col1,col2,count(*) as count 2from tbl group by col1,col2 3order by col1 asc,col2 asc;
col1col2count
AX3
AY1
BY1
CX2
CZ1

JOINして集計

SQL

1select t3.col1,t3.col2,coalesce(count,'NG') as count 2from (select distinct t1.col1,t2.col2 from tbl as t1,tbl as t2) as t3 3left join (select col1,col2,count(*) as count from tbl group by col1,col2) as t4 4on t3.col1=t4.col1 and t3.col2=t4.col2 5order by col1 asc,col2 asc;
col1col2count
AX3
AY1
AZNG
BXNG
BY1
BZNG
CX2
CYNG
CZ1

投稿2017/10/12 13:23

編集2017/10/13 00:41
yambejp

総合スコア114777

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

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

sazi

2017/10/12 14:31

0未満ではないので、命題は成立しているのでは。
kopio

2017/10/13 00:31

group byしてるんだから0はないよ。
sazi

2017/10/13 02:03

そうですね、失礼しました。
low_guy_man

2017/10/13 04:28

ご提案いただきました方法で、実際に打ち込んでみましたが 想定通りの結果になりました。 「group byはゼロ以下にならない」という本質を見失ってました。 本当にありがとうございました。
guest

0

すでにyambejpさんがご回答の通り、質問に記載頂いた条件ではCOUNT(*)の結果が0件となることはありません。
テーブルを外部結合するなどして、条件に一致しない行が発生すれば下記のように書けると思います。
RDBMSとしてMySQLを前提としています。

sql

1CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(16), value VARCHAR(16), entry INT); 2CREATE TABLE entry (id INT AUTO_INCREMENT PRIMARY KEY, value INT); 3 4INSERT INTO users (name, value, entry) VALUES 5('A', '001', 1), ('A', '001', 2), ('A', '001', 3), 6('B', '002', 4), ('B', '002', 5), ('C', '003', 1); 7 8INSERT INTO entry (value) VALUES (1),(2),(3); 9 10 11SELECT name, value, COUNT(*) count FROM users GROUP BY name, value; 12 13+------+-------+-------+ 14| name | value | count | 15+------+-------+-------+ 16| A | 001 | 3 | 17| B | 002 | 2 | 18| C | 003 | 1 | 19+------+-------+-------+ 20 21SELECT u.name, u.value, IF(COUNT(e.id) != 0, COUNT(e.id), 'NG') count FROM users u 22LEFT JOIN entry e ON u.entry = e.id GROUP BY u.name, u.value; 23 24+------+-------+-------+ 25| name | value | count | 26+------+-------+-------+ 27| A | 001 | 3 | 28| B | 002 | NG | 29| C | 003 | 1 | 30+------+-------+-------+ 31

投稿2017/10/12 20:27

編集2017/10/13 01:07
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

MySQLでの書き方がこれで良いか自信ないですが。

SQL

1SELECT COL1, COL2, CASE WHEN COUNTS = 0 THEN 'NG' ELSE TO_CHAR(COUNTS) END AS ANS 2FROM( 3 SELECT COL1, COL2, COUNT(*) AS COUNTS 4 FROM TABLE1 5 GROUP BY COL1, COL2 6 ) ;

投稿2017/10/12 13:42

Orlofsky

総合スコア16415

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

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

0

このようなやり方で実現可能です。

SQL

1SELECT 21,2, 3 CASE WHEN COUNT(*) = 0 THEN COUNT(*) ELSE 'NG' END 4FROM テーブル 5GROUP BY1,2

投稿2017/10/12 13:50

cookieman

総合スコア128

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

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

kitaji0306

2017/10/13 00:21

これだとカウントが0以外がNGになってしまうのでは?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問