回答編集履歴
5
SQLの記述を追記
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の記述を追記
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文修正及びコメントの追加
test
CHANGED
@@ -24,7 +24,7 @@
|
|
24
24
|
|
25
25
|
会員ID varchar(10)
|
26
26
|
|
27
|
-
, 入退会区分
|
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 区分
|
153
|
+
age( max( y.入退会日 ) filter( where 区分 > 1 ) -- 退会
|
154
|
-
|
154
|
+
|
155
|
-
, max( y.入退会日 ) filter( where 区分
|
155
|
+
, max( y.入退会日 ) filter( where 区分 = 1 ) -- 入会
|
156
156
|
|
157
157
|
)
|
158
158
|
|
2
コメント追加
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文修正
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 入会年
|