質問編集履歴

2

削除したい

2020/03/04 23:36

投稿

binary2
binary2

スコア24

test CHANGED
@@ -1 +1 @@
1
- データを分類ごとに集計して横持ちにするSQLの書き方
1
+ データを横持ちにするSQL
test CHANGED
@@ -1,137 +1 @@
1
- 今sqlで集計する方法を迷っています。
2
-
3
- 購買系のテーブルを集計して、月毎のUUユーザーの利用数と1人当たりの平均利用回数を求めたい。
4
-
5
-
6
-
7
- DBはBQです。
8
-
9
-
10
-
11
- テーブル情報(event)
12
-
13
- ・id(primary):連番 
14
-
15
- ・month:利用月 
16
-
17
- ・user_id:ユーザーID 
18
-
19
- ・category:カテゴリ
20
-
21
-
22
-
23
- 一つの項目であれば、
24
-
25
-
26
-
27
- ```sql
28
-
29
- WITH
30
-
31
-   data AS (
32
-
33
-   SELECT
34
-
35
-     month,
36
-
37
-     COUNT(user_id) AS user_cnt
38
-
39
-   FROM
40
-
41
-     event
42
-
43
-   GROUP BY
44
-
45
-     month,
46
-
47
-     user_id )
48
-
49
-
50
-
51
- SELECT
52
-
53
-   month,
54
-
55
-   COUNT(user_cnt) AS UU,
56
-
57
-   AVG(user_cnt) AS uer_avg
58
-
59
- FROM
60
-
61
-   data
62
-
63
- GROUP BY
64
-
65
-   month
66
-
67
- ```
68
-
69
-
70
-
71
- これを、category(pc,sp,app)の3種類でUUに分けて、横持ちにしたい場合
72
-
73
-
74
-
75
- ```sql
76
-
77
- WITH
78
-
79
- data AS (
80
-
81
- SELECT
82
-
83
- month,
84
-
85
- COUNT(CASE WHEN category="pc" THEN 1 ELSE NULL END) AS user_pc_cnt,
86
-
87
- COUNT(CASE WHEN category="sp" THEN 1 ELSE NULL END) AS user_sp_cnt,
88
-
89
- COUNT(CASE WHEN category="app" THEN 1 ELSE NULL END) AS user_app_cnt,
90
-
91
- FROM
92
-
93
- event
94
-
95
- GROUP BY
96
-
97
- month,
98
-
99
- category,
100
-
101
- user_id )
102
-
103
-
104
-
105
- SELECT
106
-
107
- month,
108
-
109
- COUNT(CASE WHEN user_pc_cnt > 0 THEN 1 ELSE NULL END) AS pc_UU,
110
-
111
- coalesce( AVG(CASE WHEN user_pc_cnt > 0 THEN user_pc_cnt ELSE NULL END),0) AS user_pc_avg,
112
-
113
- COUNT(CASE WHEN user_sp_cnt > 0 THEN 1 ELSE NULL END) AS sp_UU,
114
-
115
- coalesce( AVG(CASE WHEN user_sp_cnt > 0 THEN user_sp_cnt ELSE NULL END),0) AS user_sp_avg,
116
-
117
- COUNT(CASE WHEN user_app_cnt > 0 THEN 1 ELSE NULL END) AS app_UU,
118
-
119
- coalesce( AVG(CASE WHEN user_app_cnt > 0 THEN user_app_cnt ELSE NULL END),0) AS user_app_avg,
120
-
121
- FROM
122
-
123
- data
124
-
125
- GROUP BY
126
-
127
- month
128
-
129
- ```
130
-
131
-
132
-
133
- となる。
134
-
135
- 値はあっているのですが、case文を2回使くどい。。
1
+ SQLデータを横持ちにる場合はcase文を乱用してるが他に方法はあるのか?
136
-
137
- もっとうまい書き方ありますかね?

1

DB種類について

2020/03/04 23:36

投稿

binary2
binary2

スコア24

test CHANGED
File without changes
test CHANGED
@@ -1,6 +1,10 @@
1
1
  今sqlで集計する方法を迷っています。
2
2
 
3
3
  購買系のテーブルを集計して、月毎のUUユーザーの利用数と1人当たりの平均利用回数を求めたい。
4
+
5
+
6
+
7
+ DBはBQです。
4
8
 
5
9
 
6
10