質問するログイン新規登録

回答編集履歴

11

変更

2017/08/25 15:32

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -22,7 +22,7 @@
22
22
  (4,'KK');
23
23
 
24
24
  SELECT ORG, COUNT(DISTINCT T1.会員ID) FROM
25
- (SELECT DISTINCT ORG, 会員ID FROM
25
+ (SELECT ORG, 会員ID FROM
26
26
  (SELECT 会員ID, UNNEST(t4.組織コード) ORG
27
27
  FROM (SELECT t5.* FROM テーブル1 t5
28
28
  JOIN テーブル2 t2 ON t5.会員ID=t2.会員ID AND t2.アクションフラグ='1'

10

変更

2017/08/25 15:32

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -1,4 +1,4 @@
1
- 頂いた例に変更しました。 配列版で複数
1
+ サブクエリの件数絞る様に変更しました。
2
2
  ```sql
3
3
  create temp table テーブル1 (会員ID int,住所 text, 組織コード text[]);
4
4
  insert into テーブル1 values
@@ -23,11 +23,16 @@
23
23
 
24
24
  SELECT ORG, COUNT(DISTINCT T1.会員ID) FROM
25
25
  (SELECT DISTINCT ORG, 会員ID FROM
26
- (SELECT 会員ID, UNNEST(テーブル1.組織コード) ORG FROM テーブル1
26
+ (SELECT 会員ID, UNNEST(t4.組織コード) ORG
27
+ FROM (SELECT t5.* FROM テーブル1 t5
28
+ JOIN テーブル2 t2 ON t5.会員ID=t2.会員ID AND t2.アクションフラグ='1'
27
- WHERE 住所 IN('東京','千葉')) t0
29
+ WHERE 住所 IN ('東京','千葉')
30
+ ) t4
31
+ ) t0 WHERE ORG IN ('SS','PP','QQ','CC')
28
32
  UNION
29
- SELECT 組織コード, 会員ID FROM テーブル3 WHERE 組織コード = 'SS'
33
+ SELECT 組織コード, t6.会員ID FROM テーブル3 t6
34
+ JOIN テーブル2 t2 ON t6.会員ID=t2.会員ID AND t2.アクションフラグ='1'
35
+ WHERE 組織コード='SS'
30
36
  ) t1
31
- JOIN テーブル2 t2 ON t1.会員ID=t2.会員ID AND t2.アクションフラグ = '1'
32
37
  GROUP BY 1;
33
38
  ```

9

変更

2017/08/25 12:23

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -2,10 +2,10 @@
2
2
  ```sql
3
3
  create temp table テーブル1 (会員ID int,住所 text, 組織コード text[]);
4
4
  insert into テーブル1 values
5
+ (1,'東京','{SS,PP,QQ,RR,TT,JJ}'),
6
+ (2,'神奈川','{SR,LL,MM,KK,PP}'),
5
- (1,'東京','{SS,PP}'),
7
+ (3,'千葉','{SS,PP,CC,ZZ}'),
6
- (2,'神奈川','{SR}'),
7
- (3,'千葉','{SS}'),
8
- (4,'東京','{NO}');
8
+ (4,'東京','{NO,PO,WO,HO}');
9
9
 
10
10
  create temp table テーブル2 (会員ID int,アクションフラグ int);
11
11
  insert into テーブル2 values
@@ -14,25 +14,20 @@
14
14
  (3,1),
15
15
  (4,0);
16
16
 
17
- create temp table テーブル3 (会員ID int,組織コード text[]);
17
+ create temp table テーブル3 (会員ID int,組織コード text);
18
18
  insert into テーブル3 values
19
- (1,'{SS}'),
19
+ (1,'SS'),
20
- (1,'{SS}'),
20
+ (1,'SS'),
21
- (2,'{SS}'),
21
+ (2,'SS'),
22
- (4,'{KK}');
22
+ (4,'KK');
23
23
 
24
+ SELECT ORG, COUNT(DISTINCT T1.会員ID) FROM
24
- select count(distinct 会員) from
25
+ (SELECT DISTINCT ORG, 会員ID FROM
26
+ (SELECT 会員ID, UNNEST(テーブル1.組織コード) ORG FROM テーブル1
25
- (select case when 'SS' = any(組織コード) or 'KK' = any(組織コード) then 会員ID else null end 会員 from テーブル1
27
+ WHERE 住所 IN('東京','千葉')) t0
26
- union
28
+ UNION
27
- select case when 'SS' = any(組織コード) or 'KK' = any(組織コード) then 会員ID else null end 会員 from テーブル3
29
+ SELECT 組織コード, 会員ID FROM テーブル3 WHERE 組織コード = 'SS'
28
- ) t1;
30
+ ) t1
29
- ```
30
-
31
- 頂いた例を元に変更しました。 
32
- ```sql
33
- select count(distinct 会員) from
34
- (select case when 'SS' = any(string_to_array(組織コード,',')) then 会員ID else null end 会員 from テーブル1
35
- union
36
- select case when 'SS' = any(string_to_array(組織コード,',')) then 会員ID else null end 会員 from テーブル3
31
+ JOIN テーブル2 t2 ON t1.会員ID=t2.会員ID AND t2.アクションフラグ = '1'
37
- ) t1;
32
+ GROUP BY 1;
38
33
  ```

8

追加

2017/08/25 09:18

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -1,5 +1,26 @@
1
1
  頂いた例を元に変更しました。 配列版で複数
2
2
  ```sql
3
+ create temp table テーブル1 (会員ID int,住所 text, 組織コード text[]);
4
+ insert into テーブル1 values
5
+ (1,'東京','{SS,PP}'),
6
+ (2,'神奈川','{SR}'),
7
+ (3,'千葉','{SS}'),
8
+ (4,'東京','{NO}');
9
+
10
+ create temp table テーブル2 (会員ID int,アクションフラグ int);
11
+ insert into テーブル2 values
12
+ (1,0),
13
+ (1,0),
14
+ (3,1),
15
+ (4,0);
16
+
17
+ create temp table テーブル3 (会員ID int,組織コード text[]);
18
+ insert into テーブル3 values
19
+ (1,'{SS}'),
20
+ (1,'{SS}'),
21
+ (2,'{SS}'),
22
+ (4,'{KK}');
23
+
3
24
  select count(distinct 会員) from
4
25
  (select case when 'SS' = any(組織コード) or 'KK' = any(組織コード) then 会員ID else null end 会員 from テーブル1
5
26
  union

7

変更

2017/08/25 03:50

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -1,6 +1,15 @@
1
- 頂いた例を元に変更しました。 変更
1
+ 頂いた例を元に変更しました。 配列で複数
2
2
  ```sql
3
3
  select count(distinct 会員) from
4
+ (select case when 'SS' = any(組織コード) or 'KK' = any(組織コード) then 会員ID else null end 会員 from テーブル1
5
+ union
6
+ select case when 'SS' = any(組織コード) or 'KK' = any(組織コード) then 会員ID else null end 会員 from テーブル3
7
+ ) t1;
8
+ ```
9
+
10
+ 頂いた例を元に変更しました。 
11
+ ```sql
12
+ select count(distinct 会員) from
4
13
  (select case when 'SS' = any(string_to_array(組織コード,',')) then 会員ID else null end 会員 from テーブル1
5
14
  union
6
15
  select case when 'SS' = any(string_to_array(組織コード,',')) then 会員ID else null end 会員 from テーブル3

6

改変

2017/08/25 03:42

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -1,30 +1,8 @@
1
- 頂いた例を元に変更しました。
1
+ 頂いた例を元に変更しました。 変更版
2
-
3
2
  ```sql
4
- 会員id | 住所 | 組織コード
5
- --------+--------+------------
6
- 1 | 東京 | SS
7
- 2 | 神奈川 | SR
8
- 3 | 千葉 | SS
9
- 4 | 東京 | NO
10
- (4 rows)
11
- 会員id | アクションフラグ
12
- --------+------------------
13
- 1 | 0
14
- 1 | 0
15
- 3 | 1
16
- 4 | 0
17
- (4 rows)
18
- 会員id | 組織コード
19
- --------+------------
20
- 1 | SS
21
- 1 | SS
22
- 2 | SS
23
- 4 | KK
24
- (4 rows)
25
- テーブル2が使えませんでしたが
26
- select count (会員ID) from
3
+ select count(distinct 会員) from
27
- (select 会員ID from テーブル1 where 組織コード='SS'
4
+ (select case when 'SS' = any(string_to_array(組織コード,',')) then 会員ID else null end 会員 from テーブル1
28
- union
5
+ union
29
- select 会員ID from テーブル3 where 組織コード='SS') t1;
6
+ select case when 'SS' = any(string_to_array(組織コード,',')) then 会員ID else null end 会員 from テーブル3
7
+ ) t1;
30
8
  ```

5

変更

2017/08/25 03:28

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -1,24 +1,6 @@
1
- テーブルレイアウトが有れば良のですが、エラーとならない様に変更してみました。
1
+ た例を元に変更しました。
2
2
 
3
3
  ```sql
4
- SELECT COUNT(DISTINCT テーブル1.会員ID),
5
- CASE WHEN '組織コード' = ANY(テーブル1.組織名) THEN '組織名' ELSE 'その他' END as ORGANIZATION
6
- FROM テーブル1
7
- INNER JOIN テーブル2 ON テーブル1.会員ID = テーブル2.会員ID
8
- INNER JOIN テーブル3 ON テーブル2.会員ID = テーブル3.会員ID
9
- GROUP BY 2
10
- ;
11
-
12
- -- ここにテーブル3の特定の組織コードを持つ人も足してカウントしたい場合
13
- SELECT COUNT(DISTINCT テーブル1.会員ID)
14
- CASE WHEN '組織コード' = ANY(テーブル1.組織名) OR '特定組織コード' = ANY(テーブル3.組織名) THEN '組織名' ELSE 'その他' END as ORGANIZATION
15
- FROM テーブル1
16
- INNER JOIN テーブル2 ON テーブル1.会員ID = テーブル2.会員ID
17
- INNER JOIN テーブル3 ON テーブル2.会員ID = テーブル3.会員ID
18
- GROUP BY 2
19
- ```
20
-
21
- ```sql
22
4
  会員id | 住所 | 組織コード
23
5
  --------+--------+------------
24
6
  1 | 東京 | SS

4

変更

2017/08/24 12:56

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
File without changes

3

変更

2017/08/24 12:50

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -16,4 +16,33 @@
16
16
  INNER JOIN テーブル2 ON テーブル1.会員ID = テーブル2.会員ID
17
17
  INNER JOIN テーブル3 ON テーブル2.会員ID = テーブル3.会員ID
18
18
  GROUP BY 2
19
+ ```
20
+
21
+ ```sql
22
+ 会員id | 住所 | 組織コード
23
+ --------+--------+------------
24
+ 1 | 東京 | SS
25
+ 2 | 神奈川 | SR
26
+ 3 | 千葉 | SS
27
+ 4 | 東京 | NO
28
+ (4 rows)
29
+ 会員id | アクションフラグ
30
+ --------+------------------
31
+ 1 | 0
32
+ 1 | 0
33
+ 3 | 1
34
+ 4 | 0
35
+ (4 rows)
36
+ 会員id | 組織コード
37
+ --------+------------
38
+ 1 | SS
39
+ 1 | SS
40
+ 2 | SS
41
+ 4 | KK
42
+ (4 rows)
43
+ テーブル2が使えませんでしたが
44
+ select count (会員ID) from
45
+ (select 会員ID from テーブル1 where 組織コード='SS'
46
+ union
47
+ select 会員ID from テーブル3 where 組織コード='SS') t1;
19
48
  ```

2

変更

2017/08/24 12:50

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  ```sql
4
4
  SELECT COUNT(DISTINCT テーブル1.会員ID),
5
- (CASE WHEN '組織コード' = ANY(テーブル1.組織名) THEN '組織名' ELSE 'その他' END) as ORGANIZATION
5
+ CASE WHEN '組織コード' = ANY(テーブル1.組織名) THEN '組織名' ELSE 'その他' END as ORGANIZATION
6
6
  FROM テーブル1
7
7
  INNER JOIN テーブル2 ON テーブル1.会員ID = テーブル2.会員ID
8
8
  INNER JOIN テーブル3 ON テーブル2.会員ID = テーブル3.会員ID
@@ -11,7 +11,7 @@
11
11
 
12
12
  -- ここにテーブル3の特定の組織コードを持つ人も足してカウントしたい場合
13
13
  SELECT COUNT(DISTINCT テーブル1.会員ID)
14
- (CASE WHEN '組織コード' = ANY(テーブル1.組織名) OR '特定組織コード' = ANY(テーブル3.組織名) THEN '組織名' ELSE 'その他' END) as ORGANIZATION
14
+ CASE WHEN '組織コード' = ANY(テーブル1.組織名) OR '特定組織コード' = ANY(テーブル3.組織名) THEN '組織名' ELSE 'その他' END as ORGANIZATION
15
15
  FROM テーブル1
16
16
  INNER JOIN テーブル2 ON テーブル1.会員ID = テーブル2.会員ID
17
17
  INNER JOIN テーブル3 ON テーブル2.会員ID = テーブル3.会員ID

1

変更

2017/08/23 23:42

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -9,10 +9,11 @@
9
9
  GROUP BY 2
10
10
  ;
11
11
 
12
+ -- ここにテーブル3の特定の組織コードを持つ人も足してカウントしたい場合
12
- SELECT COUNT(DISTINCT テーブル1.会員ID)+COUNT(DISTINCT テーブル3.会員ID),
13
+ SELECT COUNT(DISTINCT テーブル1.会員ID)
13
- (CASE WHEN '組織コード' = ANY(テーブル1.組織名) OR '組織コード' = ANY(テーブル3.組織名) THEN '組織名' ELSE 'その他' END) as ORGANIZATION
14
+ (CASE WHEN '組織コード' = ANY(テーブル1.組織名) OR '特定組織コード' = ANY(テーブル3.組織名) THEN '組織名' ELSE 'その他' END) as ORGANIZATION
14
15
  FROM テーブル1
15
- LEFT JOIN テーブル2 ON テーブル1.会員ID = テーブル2.会員ID
16
+ INNER JOIN テーブル2 ON テーブル1.会員ID = テーブル2.会員ID
16
- LEFT JOIN テーブル3 ON テーブル2.会員ID = テーブル3.会員ID
17
+ INNER JOIN テーブル3 ON テーブル2.会員ID = テーブル3.会員ID
17
18
  GROUP BY 2
18
19
  ```