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

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

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

dateは、date型や日付に関する関数や処理についてのタグです

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

2回答

4568閲覧

SQLで複数列から特定の値があるレコードのみの抽出方法を教えてください。

zumaxchan

総合スコア10

date

dateは、date型や日付に関する関数や処理についてのタグです

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クリップ

投稿2017/08/23 09:46

編集2022/01/12 10:55

下記のSQLは絞り込み条件を省略していますが、3つのテーブルを連結してテーブル3の特定の組織コードを持つレコードも抽出したいです。

テーブルの連結はあっていると思います。

SELECT COUNT(DISTINCT テーブル1.会員ID),(CASE WHEN '組織コード' = ANY(テーブル1.組織名) THEN '組織名'
ELSE 'その他' END) as ORGANIZATION
FROM テーブル1 INNER JOIN (テーブル2 INNER JOIN テーブル3 ON テーブル2.会員ID = テーブル3.会員ID)
ON テーブル1.会員ID = テーブル2.会員ID
GROUP BY CASE
WHEN '組織コード' = ANY(テーブル1.組織名)) THEN '組織名' ELSE 'その他' END;

ここにテーブル3の特定の組織コードを持つ人も足してカウントしたい場合はどのようにすればよいでしょうか?

SELECT COUNT(DISTINCT テーブル1.会員ID),(CASE
WHEN '組織コード' = ANY(テーブル1.組織名) OR '組織コード' = ANY(テーブル3.組織名)) THEN '組織名'
ELSE 'その他' END) as ORGANIZATION
FROM テーブル1 INNER JOIN (テーブル2 INNER JOIN テーブル3 ON テーブル2.会員ID = テーブル3.会員ID)
ON テーブル1.会員ID = テーブル2.会員ID
GROUP BY CASE
WHEN '組織コード' = ANY(テーブル1.組織名) OR '組織コード' = ANY(テーブル3.組織名)) THEN '組織名' ELSE 'その他' END;

としてもエラーとなってしまいます。すみませんがよろしくお願いいたします。

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

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

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

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

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

A.Ichi

2017/08/23 10:27

1行目の括弧が多いのは(テーブル1.組織名))タイプミスでしょうか?CASEの部分です
yambejp

2017/08/24 03:08

具体的なサンプルデータとほしい結果を提示されたほうがよいかと
zumaxchan

2017/08/24 05:13

出したい結果は、テーブル1(マスタ)とテーブル2とテーブル3がありテーブル2とテーブル3に特定の組織コードを持っている人をユニークでカウントしたいです。テーブル2とテーブル3で重複して同じ組織コードを持っている人も混じっています。
guest

回答2

0

こんにちは。

提示されているSQLにテーブル3の条件を追加するということだけ重視してSQLを考えてみました。

テーブル2の条件などは提示されている結果を大きく崩さなければ、質問者様で追加が可能だと考えています。(提示されている情報が不足していることが、SQLに敢えて記述していない理由です)

以下前提

テーブル1またはテーブル3に特定のコードを持つ会員の数をカウントする。
特定のコードについて、テーブル1には配列型で保持しており、テーブル3はイベント履歴であり同一会員IDが複数登録される。
※テーブル1に登録のない会員IDはテーブル3やテーブル2には登録されない。

SQL

1select count(*), organization 2from ( 3 select * 4 , case when '組織コード'=any(組織名) 5 or exists(select 1 from テーブル3 where '組織コード'=組織コード and 会員id=t1.会員id) 6 then '組織名' else 'その他' end as organization 7 from テーブル1 t1 8) v1 9group by organization

投稿2017/08/26 04:22

編集2017/08/26 04:25
sazi

総合スコア25138

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

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

zumaxchan

2017/08/28 02:05

すみません。すでに私には複雑でテーブル2の条件をどこに足せばいいかわかりません。
guest

0

サブクエリの件数を絞る様に変更しました。

sql

1create temp table テーブル1 (会員ID int,住所 text, 組織コード text[]); 2insert into テーブル1 values 3(1,'東京','{SS,PP,QQ,RR,TT,JJ}'), 4(2,'神奈川','{SR,LL,MM,KK,PP}'), 5(3,'千葉','{SS,PP,CC,ZZ}'), 6(4,'東京','{NO,PO,WO,HO}'); 7 8create temp table テーブル2 (会員ID int,アクションフラグ int); 9insert into テーブル2 values 10(1,0), 11(1,0), 12(3,1), 13(4,0); 14 15create temp table テーブル3 (会員ID int,組織コード text); 16insert into テーブル3 values 17(1,'SS'), 18(1,'SS'), 19(2,'SS'), 20(4,'KK'); 21 22SELECT ORG, COUNT(DISTINCT T1.会員ID) FROM 23 (SELECT ORG, 会員ID FROM 24 (SELECT 会員ID, UNNEST(t4.組織コード) ORG 25 FROM (SELECT t5.* FROM テーブル1 t5 26 JOIN テーブル2 t2 ON t5.会員ID=t2.会員ID AND t2.アクションフラグ='1' 27 WHERE 住所 IN ('東京','千葉') 28 ) t4 29 ) t0 WHERE ORG IN ('SS','PP','QQ','CC') 30 UNION 31 SELECT 組織コード, t6.会員ID FROM テーブル3 t6 32 JOIN テーブル2 t2 ON t6.会員ID=t2.会員ID AND t2.アクションフラグ='1' 33 WHERE 組織コード='SS' 34 ) t1 35GROUP BY 1;

投稿2017/08/23 11:01

編集2017/08/25 15:32
A.Ichi

総合スコア4070

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

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

zumaxchan

2017/08/24 05:14

ありがとうございます。試してみます。
A.Ichi

2017/08/24 05:46

「 ここにテーブル3の特定の組織コードを持つ人も足してカウントしたい場合 」の理解ができませんでした。もう少し詳しく教えて頂ければ有難いです。テーブル1、2、3の関係が知りたいです。
zumaxchan

2017/08/24 07:34

テーブル1はマスタで会員情報が入っていてその中に組織コードがあります。 テーブル2はコンタクト履歴データで対象をセグメントするのに使います。 テーブル3はイベント履歴データでその中にある組織コードも対象です。 テーブル1とテーブル3にある特定の組織コードをもつ会員を出したいです。 組織コードはテーブル1とテーブル3で重複している人もいるので、ユニークな会員IDでDISTINCTしたいと思っています。
zumaxchan

2017/08/24 07:47

上記のSQL試しましたが、やはり CASE WHEN の行でエラーになりました。 THENのところに指定があるのですが???
A.Ichi

2017/08/24 07:51

postgresでしょうか?バージョンもお分かりになれば、自環境ではエラーとはなりません。
A.Ichi

2017/08/24 08:01

ANY(テーブル1.組織名)とする場合、項目の組織名は、文字の配列となります。テーブルの項目定義はどのようになっておられるのでしょうか?
zumaxchan

2017/08/24 09:30

postgres4.0.4.0で、組織コードはテーブル1,テーブル2ともに varchar 2 です。
zumaxchan

2017/08/24 09:53

テーブル1 会員ID,住所,組織コード 1,東京,SS 2,神奈川,SR 3,千葉,SS 4,東京,NO テーブル2 会員ID,アクションフラグ 1,0 1,0 3,1 4,0 テーブル3 会員ID,組織コード 1,SS 1,SS 2,SS 4,KK 組織コードSSをカウントしたいとなるとテーブル1の会員ID 1と3。テーブル3の会員ID 1と2が対象→会員ID1は重複しているのでカウント数は3件
zumaxchan

2017/08/24 09:54

としたいです。
zumaxchan

2017/08/25 01:59

組織コードは一度に複数だしたいので、Where より CASE WHEN の方がいいです。あと組織コードは1カラムに複数でカンマ区切りで格納されているためWHERE ではなく ANY をつかった方が正しく抽出できます。
A.Ichi

2017/08/25 03:13 編集

項目の組織名は配列"組織名 text[]"で定義されていると言うことでしょうか?ANYは文字列には使用できないと思いますが、そうでななければstring_to_arrayを使うの方法ですね。
zumaxchan

2017/08/25 03:29

テーブル1の組織コードは、{SS,KK,RT}というような感じで複数格納されています。テーブル3の組織コードは SS といったように単一の値が入っています。
zumaxchan

2017/08/25 03:30

ちなみにテーブル1の組織コードはANYで出せますが、テーブル3を掛け合わせるとエラーになるので困っています。
A.Ichi

2017/08/25 03:38

出力が中括弧で括られている場合はその項目は恐らく配列です。{SS,KK,RT}
zumaxchan

2017/08/25 04:11

SELECT COUNT (会員ID) FROM (SELECT 会員ID FROM テーブル1 WHERE 'SS' = ANY(t1の組織コード) UNION SELECT 会員ID FROM テーブル3 WHERE 組織コード = 'SS') t1; で抽出できました!ありがとうございます。 が、ここに絞り込み条件を足したいのですが、どのようにいれればよいでしょうか? テーブル2のアクションフラグとテーブル1の住所で絞りたいです。
zumaxchan

2017/08/25 04:24

SELECT COUNT (会員ID) FROM (SELECT 会員ID FROM テーブル1 WHERE 'SS' = ANY(t1の組織コード) AND 住所 = '東京' UNION SELECT 会員ID FROM テーブル3 WHERE 組織コード = 'SS') t1; まではいきましたが、テーブル2が連結できません。教えていただけないでしょうか。
A.Ichi

2017/08/25 04:31

SELECT COUNT(DISTINCT t1.会員ID) FROM (SELECT 会員ID FROM テーブル1 WHERE 'SS' = ANY(テーブル1.組織コード) UNION SELECT 会員ID FROM テーブル3 WHERE 組織コード = 'SS') t1 JOIN テーブル2 t2 ON t1.会員ID=t2.会員ID AND t2.アクションフラグ=1 JOIN テーブル1 t3 ON t1.会員ID=t2.会員ID AND t3.住所='東京'; かな?
zumaxchan

2017/08/25 06:17 編集

ありがとうございます。 SELECT COUNT(DISTINCT t1.会員ID) FROM (SELECT 会員ID FROM テーブル1 WHERE 'SS' = ANY(テーブル1.組織コード) AND 住所 IN('東京','神奈川') UNION SELECT 会員ID FROM テーブル3 WHERE 組織コード = 'SS') t1 JOIN テーブル2 t2 ON t1.会員ID=t2.会員ID AND t2.アクションフラグ = '1' で抽出はできたのですが、組織コードを20パターンくらい抽出するので1回でやりたいです。CASE WHEN などでまとめて出せれば最高なのですが。。。
A.Ichi

2017/08/25 06:55

SELECT COUNT(DISTINCT t1.会員ID) FROM ( SELECT 会員ID FROM (SELECT 会員ID, 住所, unnest(テーブル1.組織コード) ORG FROM テーブル1) t0 WHERE ORG IN ('SS','CC','PP','ZZ') AND 住所 IN('東京','千葉') UNION SELECT 会員ID FROM テーブル3 WHERE 組織コード = 'SS') t1 JOIN テーブル2 t2 ON t1.会員ID=t2.会員ID AND t2.アクションフラグ = '1' ; では?
zumaxchan

2017/08/25 06:59

対象の組織コードを個別に出したいんです。 SS 100 RT 230 CC 300 みたいな感じで、一度に抽出できればうれしいなと...
A.Ichi

2017/08/25 07:21

上記の100は会員の数でしょうか? SELECT ORG, COUNT(DISTINCT T1.会員ID) FROM (SELECT DISTINCT ORG, 会員ID FROM (SELECT 会員ID, UNNEST(テーブル1.組織コード) ORG FROM テーブル1) t0 UNION SELECT 組織コード, 会員ID FROM テーブル3 WHERE 組織コード = 'SS' ) t1 JOIN テーブル2 t2 ON t1.会員ID=t2.会員ID AND t2.アクションフラグ = '1' GROUP BY 1;
zumaxchan

2017/08/25 08:57

はい。上記の数字はカウント数のつもりで記入しました。 組織コード,カウント SS,100 CC,130 PP,240 ZZ,250 ... といった感じで組織コードが20パターンほどあるものを1回で抽出したいです。 ちなみに、上記SQL住所はどこに入りますか?
A.Ichi

2017/08/25 09:02

すみません住所抜けてました SELECT ORG, COUNT(DISTINCT T1.会員ID) FROM (SELECT DISTINCT ORG, 会員ID FROM (SELECT 会員ID, UNNEST(テーブル1.組織コード) ORG FROM テーブル1 WHERE 住所 IN('東京','千葉')) t0 UNION SELECT 組織コード, 会員ID FROM テーブル3 WHERE 組織コード = 'SS' ) t1 JOIN テーブル2 t2 ON t1.会員ID=t2.会員ID AND t2.アクションフラグ = '1' GROUP BY 1;
zumaxchan

2017/08/25 09:12

いえ、いつもありがとうございます。この式で組織コードSSはでますが、SSとPP,CCも同時にカウントしたい場合はどこに足していけばいいのでしょうか?
A.Ichi

2017/08/25 09:20

テーブルも含めて添付しました。PP,CCも出ているものです、件数が少ないですが。
zumaxchan

2017/08/25 09:30

PPの指定がありませんが抽出できるのでしょうか? ちなみに組織コードは無数にあり、その中の対象20パターンだけカウントしたいです。いまSQL実行していますが、完了しません。。。
zumaxchan

2017/08/25 09:32

完了しました。でました。ありがとうございます。
zumaxchan

2017/08/25 09:33

ただ、 SELECT 組織コード, 会員ID FROM テーブル3 WHERE 組織コード = 'SS' でSSしか指定していませんが、正しくでているのか心配です。
zumaxchan

2017/08/25 09:34

ここにANDで20パターン足せば良いのでしょうか?
zumaxchan

2017/08/25 09:37

あと、出た数字が少し大きい気がするので、なにか条件が反映されていないかもしれません。
A.Ichi

2017/08/25 11:55

早くする方法を考えてみます。unnestに時間が掛かるので、住所とアクションプラグで最初に絞る様にします。そこで質問ですがテーブル3は住所で絞る必要はないのでしょうか?
A.Ichi

2017/08/25 12:24

unnestを行う前に件数を絞る様に変更し添付しました。
sazi

2017/08/26 01:11

横から失礼します。テーブル2についてリレーションの情報が不足していないでしょうか? テーブル2の提示されている項目だけでは、正しくリレーションできないと思われます。 この情報だけでは、テーブル3とのリレーションが、多:多にしかなりません。
A.Ichi

2017/08/26 02:52

ご指摘の通りですが最終的に会員番号でDISTINCTしてからCOUNTしているので、行けるかなと考えました。
sazi

2017/08/26 03:30

それだと、質問者様の要求であるテーブル3の件数どおりにはならないのではと思われます。 推測してSQL組み立ておられるので、苦労されていることと思います。 それも、提供される情報が省かれすぎているからで、質問者様へ情報提供してもらう意図のコメントです。
A.Ichi

2017/08/26 03:34

ご指摘ありがとうございます。同じ会員をエクストラカウントしたいのであればその通りです。テーブル3の特別条件の会員のカウント方法は、ご質問者に聞いた方がよいかも
sazi

2017/08/26 03:52 編集

質問の方にぶら下げるかどうか迷ったのですが、こちらの方が目に留まると思った次第です。申し訳ありません。 よく読むと、元のSQLではテーブル1の会員IDのみでカウントしてますね。 テーブル3はカウント対象の条件含めたいということなのでしょうね。 失礼しました。
zumaxchan

2017/08/28 02:06

エラーとなってしまいました。いったん質問が長くなってしまったので、まとめたものを新しく上げなおしました。そちらでも助けていただけるとありがたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問