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

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

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

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

Q&A

解決済

2回答

1865閲覧

SQL ジャンルごとにカウントするためのcase 文の書き方について

Yumik

総合スコア5

SQL

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

0グッド

0クリップ

投稿2019/11/27 12:10

編集2019/11/27 13:52

以下ジャンルテーブルがあり、ジャンルごとに行数をカウントしたいです。

|gn1|gn1|g2|gn2|
|:--|:--:|--:|
|1000|メンズファッション|100|トップス
|1000 | メンズファッション  |200 | アウター
|1000 | メンズファッション  |300 | ボトムス
|2000 | レディースファッション|400 | トップス
|2000 | レディースファッション|500 | ボトムス
|2000 | レディースファッション|600 | アウター

<条件>
メンズファッション>トップス → 1
メンズファッション>トップス以外 →2 
レディース>トップス → 3 
レディース>トップス以外 → 4
レディース>トップスとボトムス以外 →5

<<条件の結果>>

nosimple_count(count(*))
1xxxx
2xxxx
3xxxx
4xxxx
5xxxx
<記述した内容> select case when g1 = 1000 and g2 = 2000 then 1 when g1 = 1000 then 2 when g2 = 400 then 3 when g2 <> 400 then 4 else 5 end simple_count, count(*) as count from detail_tbl a inner join order_tbl o on a.order_no = o.order_no inner join genre_dimension b on a.genre_id = b.genre_id where b.g1 in (1000,2000) group by 1 ;

and や <> の書き方が正しくないため、1から5までの
カウント結果が抽出されません。
1~5の条件の記述の方法をご教示いただけないでしょうか。

動作確認環境:teradata studio express

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

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

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

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

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

sazi

2019/11/27 12:40 編集

DBはteradataなんでしょうか? count()を使用しているんですから、group by も含めたSQLの全文での質問にして下さい。
Yumik

2019/11/27 12:49

DBはteradata です。 SQL全文を記載しましたので、ご確認いただければ幸いです。よろしくお願いいたします。
shirokuma4690

2019/11/27 14:36

例の内容だと4が1100で5が600となってレディースのアウターは2か所でカウントされるという認識で間違いないですか?
Yumik

2019/11/27 14:48

5 の条件については g1:2000のレディースジャンルのうち、 サブジャンルのgn2:400と500以外のレディースジャンルの数を カウントしたいのです。 表でいうところだと、「no」列の5には”1”とカウントされればいいのですが。 when b.g1 = 2000 and b.g2 <> 400 and b.g2 <> 500 then 5 と書いてもみましたが、 上記表の行数でいうところ、3がカウントされてしまいます。
shirokuma4690

2019/11/27 14:57

すみません、読み間違えてました。 聞きたかったのは4と5の両方にカウントされる列があるのは正しいのかということです
Yumik

2019/11/27 15:04

>4と5の両方にカウントされる列があるのは正しい  →はい、正しいです。
guest

回答2

0

ベストアンサー

g1gn1g2gn2
2000レディースファッション600アウター

この列を2か所でカウントしなければならないのが難しいポイントとなっています。
なので以下のように考えてみてはいかがでしょうか

1.SQL1でここのカウントを取得
ーーーーー
メンズファッション>トップス → 1
メンズファッション>トップス以外 →2 
レディース>トップス → 3 
レディース>トップス以外 → 4
ーーーーー
2.SQL2でここのカウントを取得
ーーーーー
レディース>トップスとボトムス以外 →5
ーーーーー

3.SQL1とSQL2を結合

下記はSQLServerのSQLですが参考に

SQL

1SELECT 2 no, 3 COUNT(*) count 4FROM ( 5 SELECT 6 CASE 7 WHEN g1 = '1000' and g2 = '100' then 1 8 WHEN g1 = '1000' and g2 <>'100' then 2 9 WHEN g1 = '2000' and g2 = '400' then 3 10 WHEN g1 = '2000' and g2 <> '400' then 4 11 END as no 12 FROM dbo.Table_2 13 UNION ALL 14 SELECT 15 '5' as no 16 FROM dbo.Table_2 17 WHERE g1='2000' and g2 not in ('400', '500') 18) TMP 19GROUP BY no

投稿2019/11/27 15:32

shirokuma4690

総合スコア154

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

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

Yumik

2019/11/27 15:47

ありがとうございます。 初学者で恐縮なのですが、excel でのイメージとしては レディースファッション>トップス・ボトムス以外 であれば g1列で2000にフィルタ後、g2列でさらに400,500 以外でフィルタすれば 件数が出ると思うのですが、case の中のwhere ではできないものなのですね。
shirokuma4690

2019/11/27 16:02

2つめ以降のwhereはそれより前の条件で一致していないものの中から一致するものを捜すので一つの行を2つの条件で拾えないですね
Yumik

2019/11/27 16:07

ありがとうございます。 前の条件でいっちしないものを捜すとのこと、理解しました。
guest

0

select

case
when g1 = 1000 and g2 = 2000 then 1
when g1 = 1000 then 2
when g2 = 400 then 3
when g2 <> 400 then 4
else 5 end
simple_count,

「g1 = 1000 and g2 = 2000 then 1」がメンズトップスと整合性がない
テーブルのサンプルをcreate table+insertで例示し
具体的な集計パターンを示すとよいでしょう

投稿2019/11/27 12:32

yambejp

総合スコア114833

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

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

Yumik

2019/11/27 12:50

すみません、値のタイプミスがありました。 g1 = 1000 and g2 = 2000 then 1 は誤りで g1 = 1000 and g2 = 200 then 1 の記載をしました。
yambejp

2019/11/28 03:36

とにかく正しいサンプルを質問文に例示するところからです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問