Last active
January 19, 2022 10:09
-
-
Save sh16ma/ebee5fff3f44451cbcebfa7d408a160f to your computer and use it in GitHub Desktop.
#🔎 #BigQuery #クロス集計 #DS100本ノック #SQL
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#standaardSQL | |
with gender_era_amount as ( | |
select | |
c.gender_cd as gender | |
, trunc(c.age/10) * 10 as era | |
, sum(r.amount) as amount | |
from `prj-test3.100knocks.customer` as c | |
join `prj-test3.100knocks.receipt` as r | |
using(customer_id) | |
group by | |
gender | |
, era | |
) | |
select | |
era | |
, max(case gender when 0 then amount else 0 end) as male | |
, max(case gender when 1 then amount else 0 end) as female | |
, max(case gender when 9 then amount else 0 end) as unknown | |
from gender_era_amount | |
group by era | |
order by era | |
; |
① WITH句内クエリ分解
select
c.gender_cd as gender
, trunc(c.age/10) * 10 as era
, sum(r.amount) as amount
from `prj-test3.100knocks.customer` as c
join `prj-test3.100knocks.receipt` as r
using(customer_id)
group by
gender
, era
order by era
limit 10
;
② WITH句直下クエリ分解
select
era
, case gender when 0 then amount else 0 end as male
, case gender when 1 then amount else 0 end as female
, case gender when 9 then amount else 0 end as unknown
from gender_era_amount
order by era
limit 10
;
最終的に「era」でグループ化させて、各属性の最大値を集計関数でまとめている。
select era , max(case gender when 0 then amount else 0 end) as male , max(case gender when 1 then amount else 0 end) as female , max(case gender when 9 then amount else 0 end) as unknown from gender_era_amount group by era order by era ;
自身が記述した💩 コード
with
tb as (
select
sales_ymd
, gender
, age
, case
when age < 20 then "10's"
when age between 20 and 29 then "20's"
when age between 30 and 39 then "30's"
when age between 40 and 49 then "40's"
when age between 50 and 59 then "50's"
when age between 60 and 69 then "60's"
when age between 70 and 79 then "70's"
else "Over80's"
end as age_category
, amount
from
`prj-test3.100knocks.receipt`
left join
`prj-test3.100knocks.customer`
using(customer_id)
where gender is not null
)
select
*
from
(select
age_category
, sum(amount) as male
from tb
where gender = "男性"
group by age_category)
left join
(select
age_category
, sum(amount) as female
from tb
where gender = "女性"
group by age_category) using(age_category)
left join
(select
age_category
, sum(amount) as unknown
from tb
where gender = "不明"
group by age_category) using(age_category)
order by age_category
;
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
解 : クエリ完了(経過時間: 1.1 秒、処理されたバイト数: 3.1 MB)