下記の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;
としてもエラーとなってしまいます。すみませんがよろしくお願いいたします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
0
サブクエリの件数を絞る様に変更しました。
create temp table テーブル1 (会員ID int,住所 text, 組織コード text[]);
insert into テーブル1 values
(1,'東京','{SS,PP,QQ,RR,TT,JJ}'),
(2,'神奈川','{SR,LL,MM,KK,PP}'),
(3,'千葉','{SS,PP,CC,ZZ}'),
(4,'東京','{NO,PO,WO,HO}');
create temp table テーブル2 (会員ID int,アクションフラグ int);
insert into テーブル2 values
(1,0),
(1,0),
(3,1),
(4,0);
create temp table テーブル3 (会員ID int,組織コード text);
insert into テーブル3 values
(1,'SS'),
(1,'SS'),
(2,'SS'),
(4,'KK');
SELECT ORG, COUNT(DISTINCT T1.会員ID) FROM
(SELECT ORG, 会員ID FROM
(SELECT 会員ID, UNNEST(t4.組織コード) ORG
FROM (SELECT t5.* FROM テーブル1 t5
JOIN テーブル2 t2 ON t5.会員ID=t2.会員ID AND t2.アクションフラグ='1'
WHERE 住所 IN ('東京','千葉')
) t4
) t0 WHERE ORG IN ('SS','PP','QQ','CC')
UNION
SELECT 組織コード, t6.会員ID FROM テーブル3 t6
JOIN テーブル2 t2 ON t6.会員ID=t2.会員ID AND t2.アクションフラグ='1'
WHERE 組織コード='SS'
) t1
GROUP BY 1;
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
こんにちは。
提示されているSQLにテーブル3の条件を追加するということだけ重視してSQLを考えてみました。
テーブル2の条件などは提示されている結果を大きく崩さなければ、質問者様で追加が可能だと考えています。(提示されている情報が不足していることが、SQLに敢えて記述していない理由です)
以下前提
テーブル1またはテーブル3に特定のコードを持つ会員の数をカウントする。
特定のコードについて、テーブル1には配列型で保持しており、テーブル3はイベント履歴であり同一会員IDが複数登録される。
※テーブル1に登録のない会員IDはテーブル3やテーブル2には登録されない。
select count(*), organization
from (
select *
, case when '組織コード'=any(組織名)
or exists(select 1 from テーブル3 where '組織コード'=組織コード and 会員id=t1.会員id)
then '組織名' else 'その他' end as organization
from テーブル1 t1
) v1
group by organization
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.34%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
A.Ichi
2017/08/23 19:27
1行目の括弧が多いのは(テーブル1.組織名))タイプミスでしょうか?CASEの部分です
yambejp
2017/08/24 12:08
具体的なサンプルデータとほしい結果を提示されたほうがよいかと
zumaxchan
2017/08/24 14:13
出したい結果は、テーブル1(マスタ)とテーブル2とテーブル3がありテーブル2とテーブル3に特定の組織コードを持っている人をユニークでカウントしたいです。テーブル2とテーブル3で重複して同じ組織コードを持っている人も混じっています。