回答編集履歴

5

SQLの記述を追記

2021/10/31 08:52

投稿

mayu-
mayu-

スコア335

test CHANGED
@@ -329,3 +329,75 @@
329
329
  ;
330
330
 
331
331
  ```
332
+
333
+
334
+
335
+  
336
+
337
+ **2021/10/31 コメント欄にいただいたご要望を追記:**
338
+
339
+ > 「ステータス管理」で完結する形で、入会年と退会年のクロス集計をしたい
340
+
341
+
342
+
343
+ ```SQL
344
+
345
+ SELECT 入会年
346
+
347
+ , sum(1) filter( where 在籍年数 is null ) 継続
348
+
349
+ , sum(1) filter( where 入会年 + 在籍年数 = 2018 ) _2018
350
+
351
+ , sum(1) filter( where 入会年 + 在籍年数 = 2019 ) _2019
352
+
353
+ , sum(1) filter( where 入会年 + 在籍年数 = 2020 ) _2020
354
+
355
+ , sum(1) filter( where 入会年 + 在籍年数 = 2021 ) _2021
356
+
357
+ FROM
358
+
359
+ (
360
+
361
+ SELECT 会員ID
362
+
363
+ , 入退会区分
364
+
365
+ , date_part( 'year', 入退会日::date ) 入会年
366
+
367
+ , extract( year from
368
+
369
+ age( lead( 入退会日, 1 )
370
+
371
+ over( partition by 会員ID
372
+
373
+ order by 入退会日
374
+
375
+ , ( 入退会区分::int + 1 ) % 2
376
+
377
+ , 入退会区分::int
378
+
379
+ )::date
380
+
381
+ , 入退会日::date
382
+
383
+ )
384
+
385
+ ) 在籍年数
386
+
387
+ FROM ステータス管理
388
+
389
+ WHERE 入退会区分 IN ( '1', '2', '9' )
390
+
391
+ AND 入退会日::date >= date_trunc( 'year', now() - interval '3 year' )
392
+
393
+ ) q
394
+
395
+ WHERE 入退会区分 IN ( '1', '2' )
396
+
397
+ GROUP BY 入会年
398
+
399
+ ORDER BY 入会年
400
+
401
+ ;
402
+
403
+ ```

4

SQLの記述を追記

2021/10/31 08:52

投稿

mayu-
mayu-

スコア335

test CHANGED
@@ -235,3 +235,97 @@
235
235
  --------------------------------------------------------------
236
236
 
237
237
  ```
238
+
239
+
240
+
241
+  
242
+
243
+ **追記:**
244
+
245
+ コメント欄で返信したインラインビューを用いた一筆書きのSQLです
246
+
247
+
248
+
249
+ ```SQL
250
+
251
+ SELECT 入会年
252
+
253
+ , sum(1) filter( where 在籍年数 is null ) 継続
254
+
255
+ , sum(1) filter( where 入会年 + 在籍年数 = 2018 and 会員ランク = 'A' ) A_2018
256
+
257
+ , sum(1) filter( where 入会年 + 在籍年数 = 2018 and 会員ランク = 'B' ) B_2018
258
+
259
+ , sum(1) filter( where 入会年 + 在籍年数 = 2018 and 会員ランク = 'C' ) C_2018
260
+
261
+ , sum(1) filter( where 入会年 + 在籍年数 = 2019 and 会員ランク = 'A' ) A_2019
262
+
263
+ , sum(1) filter( where 入会年 + 在籍年数 = 2019 and 会員ランク = 'B' ) B_2019
264
+
265
+ , sum(1) filter( where 入会年 + 在籍年数 = 2019 and 会員ランク = 'C' ) C_2019
266
+
267
+ , sum(1) filter( where 入会年 + 在籍年数 = 2020 and 会員ランク = 'A' ) A_2020
268
+
269
+ , sum(1) filter( where 入会年 + 在籍年数 = 2020 and 会員ランク = 'B' ) B_2020
270
+
271
+ , sum(1) filter( where 入会年 + 在籍年数 = 2020 and 会員ランク = 'C' ) C_2020
272
+
273
+ , sum(1) filter( where 入会年 + 在籍年数 = 2021 and 会員ランク = 'A' ) A_2021
274
+
275
+ , sum(1) filter( where 入会年 + 在籍年数 = 2021 and 会員ランク = 'B' ) B_2021
276
+
277
+ , sum(1) filter( where 入会年 + 在籍年数 = 2021 and 会員ランク = 'C' ) C_2021
278
+
279
+ FROM
280
+
281
+ (
282
+
283
+ SELECT x.会員ID
284
+
285
+ , x.会員ランク
286
+
287
+ , y.入退会区分
288
+
289
+ , date_part( 'year', y.入退会日::date ) 入会年
290
+
291
+ , extract( year from
292
+
293
+ age( lead( y.入退会日, 1 )
294
+
295
+ over( partition by y.会員ID
296
+
297
+ order by y.入退会日
298
+
299
+ , ( y.入退会区分::int + 1 ) % 2
300
+
301
+ , y.入退会区分::int
302
+
303
+ )::date
304
+
305
+ , y.入退会日::date
306
+
307
+ )
308
+
309
+ ) 在籍年数
310
+
311
+ FROM 会員マスタ x
312
+
313
+ JOIN ステータス管理 y
314
+
315
+ USING ( 会員ID )
316
+
317
+ WHERE y.入退会区分 IN ( '1', '2', '9' )
318
+
319
+ AND y.入退会日::date >= date_trunc( 'year', now() - interval '3 year' )
320
+
321
+ ) q
322
+
323
+ WHERE 入退会区分 IN ( '1', '2' )
324
+
325
+ GROUP BY 入会年
326
+
327
+ ORDER BY 入会年
328
+
329
+ ;
330
+
331
+ ```

3

型の変更に伴うSQL文修正及びコメントの追加

2021/10/22 17:44

投稿

mayu-
mayu-

スコア335

test CHANGED
@@ -24,7 +24,7 @@
24
24
 
25
25
  会員ID varchar(10)
26
26
 
27
- , 入退会区分 int
27
+ , 入退会区分 varchar(3)
28
28
 
29
29
  , 入退会日 char(8)
30
30
 
@@ -64,41 +64,41 @@
64
64
 
65
65
  VALUES
66
66
 
67
- ( '0001', 1, '20180101' )
67
+ ( '0001', '1', '20180101' )
68
-
68
+
69
- , ( '0001', 9, '20180110' )
69
+ , ( '0001', '9', '20180110' )
70
-
70
+
71
- , ( '0001', 2, '20180115' )
71
+ , ( '0001', '2', '20180115' )
72
-
72
+
73
- , ( '0001', 9, '20180120' )
73
+ , ( '0001', '9', '20180120' )
74
-
74
+
75
- , ( '0002', 1, '20190101' )
75
+ , ( '0002', '1', '20190101' )
76
-
76
+
77
- , ( '0002', 9, '20190110' )
77
+ , ( '0002', '9', '20190110' )
78
-
78
+
79
- , ( '0002', 2, '20190115' )
79
+ , ( '0002', '2', '20190115' )
80
-
80
+
81
- , ( '0002', 9, '20200120' )
81
+ , ( '0002', '9', '20200120' )
82
-
82
+
83
- , ( '0003', 1, '20180115' )
83
+ , ( '0003', '1', '20180115' )
84
-
84
+
85
- , ( '0003', 9, '20201231' )
85
+ , ( '0003', '9', '20201231' )
86
-
86
+
87
- , ( '0004', 1, '20180101' )
87
+ , ( '0004', '1', '20180101' )
88
-
88
+
89
- , ( '0004', 9, '20210331' )
89
+ , ( '0004', '9', '20210331' )
90
-
90
+
91
- , ( '0005', 1, '20180120' )
91
+ , ( '0005', '1', '20180120' )
92
-
92
+
93
- , ( '0006', 1, '20190331' )
93
+ , ( '0006', '1', '20190331' )
94
-
94
+
95
- , ( '0007', 1, '20200115' )
95
+ , ( '0007', '1', '20200115' )
96
-
96
+
97
- , ( '0007', 9, '20200115' )
97
+ , ( '0007', '9', '20200115' )
98
-
98
+
99
- , ( '0007', 2, '20200115' )
99
+ , ( '0007', '2', '20200115' )
100
-
100
+
101
- , ( '0008', 1, '20201201' )
101
+ , ( '0008', '1', '20201201' )
102
102
 
103
103
  ;
104
104
 
@@ -112,21 +112,21 @@
112
112
 
113
113
  SELECT 会員ID
114
114
 
115
- , ( 入退会区分 + 3 ) / 2 - 1
115
+ , ( 入退会区分::int + 3 ) / 2 - 1
116
116
 
117
117
  , 入退会日::date
118
118
 
119
- , sum( case when 入退会区分 in ( 1, 2 ) then 1 else 0 end )
119
+ , sum( case when 入退会区分 in ( '1', '2' ) then 1 else 0 end )
120
120
 
121
121
  over( partition by 会員ID
122
122
 
123
- order by 入退会日, ( 入退会区分 + 1 ) % 2, 入退会区分
123
+ order by 入退会日, ( 入退会区分::int + 1 ) % 2, 入退会区分::int
124
124
 
125
125
  )
126
126
 
127
127
  FROM ステータス管理
128
128
 
129
- WHERE 入退会区分 IN ( 1, 2, 9 )
129
+ WHERE 入退会区分 IN ( '1', '2', '9' )
130
130
 
131
131
  /* 集計対象を2018年以降に入会した会員に限定しています。
132
132
 
@@ -150,9 +150,9 @@
150
150
 
151
151
  , extract( year from
152
152
 
153
- age( max( y.入退会日 ) filter( where 区分 != 1 )
153
+ age( max( y.入退会日 ) filter( where 区分 > 1 ) -- 退会
154
-
154
+
155
- , max( y.入退会日 ) filter( where 区分 = 1 )
155
+ , max( y.入退会日 ) filter( where 区分 = 1 ) -- 入会
156
156
 
157
157
  )
158
158
 

2

コメント追加

2021/10/21 21:07

投稿

mayu-
mayu-

スコア335

test CHANGED
@@ -128,6 +128,10 @@
128
128
 
129
129
  WHERE 入退会区分 IN ( 1, 2, 9 )
130
130
 
131
+ /* 集計対象を2018年以降に入会した会員に限定しています。
132
+
133
+ 不要なら以下の条件は削除して下さい */
134
+
131
135
  AND 入退会日::date >= date_trunc( 'year', now() - interval '3 year' )
132
136
 
133
137
  ),

1

SQL文修正

2021/10/21 14:28

投稿

mayu-
mayu-

スコア335

test CHANGED
@@ -200,6 +200,8 @@
200
200
 
201
201
  FROM step2
202
202
 
203
+ WHERE 入会年 Is Not Null
204
+
203
205
  GROUP BY 入会年
204
206
 
205
207
  ORDER BY 入会年