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

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

ただいまの
回答率

90.04%

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

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,181

zumaxchan

score 8

下記の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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 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で重複して同じ組織コードを持っている人も混じっています。

    キャンセル

回答 2

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;

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/26 12:34

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

    キャンセル

  • 2017/08/26 12:44 編集

    質問の方にぶら下げるかどうか迷ったのですが、こちらの方が目に留まると思った次第です。申し訳ありません。

    よく読むと、元のSQLではテーブル1の会員IDのみでカウントしてますね。
    テーブル3はカウント対象の条件含めたいということなのでしょうね。
    失礼しました。

    キャンセル

  • 2017/08/28 11:06

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

    キャンセル

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/28 11:05

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

    キャンセル

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

  • ただいまの回答率 90.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる