google_bigquery_6
date : 2021-09-14 title : 🔍 分析入門 Section6: 四則演算、条件分岐 excerpt : ---
tags : ["🔍", "BigQuery", "Udemy"]
|| Section6
| 四則演算
e.g. BigQueryは計算機的機能を持っている
SELECT 3*10;
f0_ | |
---|---|
1 | 30 |
e.g. 購入ID別の売上高と、税込価格を知りたい。
SELECT
purchase_id,
sales_amount,
sales_amount * 1.08 AS sales_with_tax
FROM `prj-test3.bq_sample.shop_purchases`;
purchase_id | sales_amount | sales_with_tax | |
---|---|---|---|
1 | 22 | 59400 | 64152.00000000001 |
2 | 388 | 59400 | 64152.00000000001 |
ex.【6.2 演習問題1(2:40)】
shop_purchasesテーブルから、quantityとsales_amountを利用して、purchase_idごとの平均価格を取得。 出力には、quantityとsales_amountも含める。 平均単価はavg_priceとし、昇順。
# (miss_code)
-- SELECT purchase_id,
-- quantity,
-- sales_amount,
-- AVR(sales_amount) AS avg_price
-- FROM `prj-test3.bq_sample.shop_purchases`
-- GROUP BY purchase_id
-- ORDER BY 4 DESC;
# (collect_code)
SELECT
purchase_id,
quantity,
sales_amount,
sales_amount/quantity AS avg_price
FROM `prj-test3.bq_sample.shop_purchases`
ORDER BY 4;
-- | |purchase_id|quantity|sales_amount|avg_salse|
-- |1| 301| 2| 2660| 1330.0|
-- |2| 1040| 1| 1400| 1400.0|
-- |3| 214| 5| 7600| 1520.0|
ex.【6.2 演習問題2(4:10)】
直前の演習に対して、avg_priceが5000円より多い結果だけを取得。
#(miss_code)
-- SELECT purchase_id,
-- quantity,
-- sales_amount,
-- sales_amount/quantity AS avg_sales
-- FROM `prj-test3.bq_sample.shop_purchases`
-- HAVING avg_sales > 5000
-- ORDER BY 4;
#(collect_code)
SELECT
purchase_id,
quantity,
sales_amount,
sales_amount/quantity AS avg_sales
FROM `prj-test3.bq_sample.shop_purchases`
WHERE sales_amount/quantity > 5000
ORDER BY 4;
-- | |purchase_id|quantity|sales_amount|avg_salse|
-- |1| 1196| 2| 10030| 5015.0|
-- |2| 1079| 1| 5015| 5015.0|
-- |3| 619| 3| 15045| 5015.0|
■数列に対する基本的な関数
| ROOUND() - 数字を丸める関数
SELECT
ROUND(154.249) AS basic,-- 小数点以下第位
ROUND(154.249, 1) AS Plus1, -- 小数点以下第二位
ROUND(154.249, 2) AS Plus2, -- 小数点以下第三位
ROUND(154.249, -1) AS Minus1, -- 十の位を丸める
ROUND(154.249, -2) AS Minus2; -- 百の位を丸める
basic | Plus1 | Plus2 | Minus1 | Minus2 | |
---|---|---|---|---|---|
1 | 154.0 | 154.2 | 154.25 | 150.0 | 200.0 |
| CEIL(), FLOOR() - 数字を丸める関数
切り上げ関数: CEIL()
切り捨て関数: FLOOR()
※ いずれも戻り値が整数。
※ データ型は浮動小数点(float)なので「.0」がついている。
ex.【6.3 演習問題1(4:00)】
SELECT
purchase_id,
sales_amount,
sales_amount*1.08 AS Sales_w_tax,
ROUND(sales_amount*1.08, 1) AS Round,
CEIL(sales_amount*1.08) AS Ceil,
FLOOR(sales_amount*1.08) AS Floor
FROM `prj-test3.bq_sample.shop_purchases`
-- GROUP BY purchase_id, sales_amount #[×]不要:but あっても同結果
ORDER BY purchase_id ASC
LIMIT 50;
-- | |purchase_id|sales_id|Salse_w_tax|Round |Ceil |Floor |
-- |1| 1| 112775| 13797.0|13797.0|13797.0|13797.0|
-- |2| 2| 11600| 12528.0|12528.0|12528.0|12528.0|
ex.【6.3 演習問題2(6:30)】
SELECT
purchase_id,
sales_amount,
ROUND(sales_amount*1.08, -2) AS Sales_w_tax --十の位で四捨五入
FROM `prj-test3.bq_sample.shop_purchases`
ORDER BY purchase_id
LIMIT 50;
--| |purhase_id|salse_amount|Salse_w_tax|
--|1| 1| 12775| 13800.0|
--|2| 2| 11600| 12500.0|
ex.【6.3 x演習問題3(8:00)】
SELECT
purchase_id,
sales_amount,
-- CEIL(ROUND(sales_amount*1.08, -2)) AS Salse_w_tax --[×] miss
CEIL(sales_amount*1.08/100)*100 AS Salse_w_tax --十の位で切り上げ
FROM `prj-test3.bq_sample.shop_purchases`
ORDER BY purchase_id
LIMIT 50;
--| |purhase_id|salse_amount|Salse_w_tax|
--|1| 1| 12775| 13800.0|
--|2| 2| 11600| 12600.0|
| ABS() - 絶対値
ex.【6.4 演習問題1(1:30)】
SELECT ROUND(AVG(sales_amount), 1) AS avg_salse
FROM `prj-test3.bq_sample.shop_purchases`;
--| |avg_salse|
--|1| 15693.0|
SELECT
shop_id,
AVG(sales_amount) AS avg_salse,
AVG(sales_amount)-15693 AS diff,
ABS(AVG(sales_amount)-15693) AS abs_diff
FROM `prj-test3.bq_sample.shop_purchases`
GROUP BY shop_id
ORDER BY shop_id;
--| |shop_id|avg_salse |diff |abs_diff |
--|1| 1| 15810.55632582321| 117.5563258232105| 117.5563258232105|
--|2| 2|15691.087794432557|-1.9122055674433796|1.9122055674433796|
| MOD() - 割り算の余り
MOD(割られる数, 割る数)
ex.【6.4 演習問題2(4:30)】
SELECT *
FROM `prj-test3.bq_sample.shop_purchases`
WHERE MOD(purchase_id, 3) = 0
ORDER BY purchase_id;
--| |purchase_id|user_id|date |shop_id|product_id|quantity|salse_amount|
--|1| 3| 876530|2018-01-01| 2| 19| 3| 4845|
--|2| 6| 954830|2018-01-01| 1| 17| 3| 15488|
(用途メモ)
数億レコードがあるデータから、ザクっと間引きしてみたい時に用いる。(ランダム抽出)
割り切れる数字であれば、その分データ量を1/3にしたり、1/5にしたりとすることができる。
| CAST() - 型変換
整数(INT64) → 文字列(STRNG)
少数(FLOAT64)→ 整数(INT64)
e.g.
CAST({対象かラム} AS {変換先データ型})
ex.【6.4 演習問題3(8:00)】
SELECT
purchase_id,
sales_amount,
CAST(ROUND(sales_amount*1.08, -2) AS INT64) AS sales_w_tax
FROM `prj-test3.bq_sample.shop_purchases`
GROUP BY purchase_id, sales_amount
ORDER BY 2 DESC
LIMIT 5;
--| |purchase_id|sales_amount|sales_tax|
--|1| 1203| 99000| 106900|
--|2| 995| 99000| 106900|
■文字列に対する基本的な関数
| CONCAT() - 文字列連結
e.g.
CONCAT({文字列}, {文字列}, {文字列}・・・)
ex.【6.5 演習問題1(1:50)】
SELECT
user_id,
CONCAT(last_name, " ", first_name) AS full_name
FROM `prj-test3.bq_sample.customers`
ORDER BY 1;
-- | |user_id|full_name|
-- | 1| 496070|片桐 雅友|
-- | 2| 496070|才村 歩加|
-- |21| 613645|#N-A 守 |
ex.【6.5 演習問題2(3:10)】
SELECT
purchase_id,
CONCAT(CAST(user_id AS STRING), "-", CAST(shop_id AS STRING)) AS user_shop,
sales_amount
FROM `prj-test3.bq_sample.shop_purchases`
ORDER BY purchase_id
LIMIT 10;
-- | |purchase_id|user_shop|sales_amount|
-- |1| 1|733995-2 | 12775|
| LENGTH() - 文字列の文字数取得
ex.【6.5 演習問題3(5:30)】
SELECT
product_id,
prod_name,
LENGTH(prod_name) AS letters
FROM `prj-test3.bq_sample.products_master`
ORDER BY 3;
--| |product_id|prod_name |letters|
--|1| 9|ブラウス 半袖| 7| ※半角スペースもカウント
| SUBSTR() - 文字列の一部取得
e.g. prod_nameの1番左から、5文字取得
SUBSTR(prod_name, 1, 5)
ex.【6.5 演習問題4(8:00)】
SELECT
product_id,
prod_name,
SUBSTR(prod_name, -6, 6) AS right6 --右から6文字
FROM `prj-test3.bq_sample.products_master`
ORDER BY product_id;
--| |product_id|prod_name |right6 |
--|1| 1|オックスフォードシャツ 綿 100%|綿 100%|
| REPLACE() - 文字列の一部置き換え
e.g. ing(現在進行形) を ed(過去形) に置き換える
REPLACE("creating", "ing", "ed")
ex.【6.5 演習問題5(10:10)】
SELECT
product_id,
prod_name,
REPLACE(prod_name, "半袖", "七分袖") AS prod_name
FROM `prj-test3.bq_sample.products_master`
ORDER BY product_id;
--| |product_id|prod_name |prod_name_1 |
--|7| 7|ポロシャツ 半袖|ポロシャツ 七分袖|
--|8| 8|ポロシャツ 長袖|ポロシャツ 長袖 |
| TRIM() - 文字列の前後の空白、任意の文字数削除
e.g.
TRIM({文字列}, {削除したい文字})
-- 文字列前後の$マークを削除したい
TRIM(文字列,"$")
ex.【6.5 演習問題6(12:00)】
SELECT
" 平成 ",
TRIM(" 平成 ");
--| |f0_ |f1_ |
--|1| 平成 |平成|
SELECT
"https://www.udemy.com",
TRIM("https://www.udemy.com", "https://");
--| |f0_ |f1_ |
--|1|https://www.udemy.com|www.udemy.com|
■正規表現
(BigQueryには正規表現を利用できる関数がある。)
| REGEXP_CONTAINS() - 指定正規表現の含有の有無
e.g.
REGEXP_CONTAIN(文字列, r"正規表現")
/*文字列に [?] が入っているか否か確認。*/
SELECT
REGEXP_CONTAINS("/products/?id=15", r"\?"),
REGEXP_CONTAINS("/company/", r"\?");
--Windowsでは \ ではなく ¥
f0_ | f1_ | |
---|---|---|
1 | true | false |
ex.【6.6 演習問題1(2:50)】
#(miss_code)
-- SELECT
-- REGEXP_CONTAINS(page, r"\?") IS TRUE AS prob_dir,
-- SUM(pageview) AS PV
-- FROM `prj-test3.bq_sample.web_usage`
-- GROUP BY 1;
-- | |prob_dir|PV |
-- |1|false | 653|
-- |2|true |1945|
#(collect_code)
SELECT SUM(pageview) AS PV
FROM `prj-test3.bq_sample.web_usage`
WHERE REGEXP_CONTAINS(page, r"^/products/\?id=[0-9][0-9]?$") IS TRUE;
--[0-9]:0~9数字が1つ、 ?:直前の文字があってもなくても良いの意味
-- | |PV |
-- |1|1944|
| REGEXP_EXTRACT() - 文字列抽出
e.g.
REGEXP_EXTRACT(value, regex [, position[, occurrence]])
SELECT
-- ^:始めから、[^@]:@でないところまで、+:1つ以上の繰り返す
REGEXP_EXTRACT("[email protected]", r"^[^@]+"),
-- -()-:ハイフンに囲まれた、\d:数字、+:1つ以上の繰り返す
REGEXP_EXTRACT("03-1234-5678", r"-(\d+)-"),
-- /の後に、\s:半角スペース、(.+):どんな文字列でも1つ以上の繰り返されたもの、$:最後まで
REGEXP_EXTRACT("google / organic", r"/\s(.+)$");
f0_ | f1_ | f2_ | |
---|---|---|---|
1 | sample | 1234 | organic |
| REGEXP_REPLACE() - 置き換え
e.g.
REGEXP_REPLACE(value, regex, replacement)
SELECT
-- [a]と、[.]:何でもいいと、[c]の文字列
REGEXP_REPLACE("[email protected]", r"a.c", "XYZ"),
REGEXP_REPLACE("[email protected]", r"a.c", "XYZ"),
-- [^@]:@マークでない全ての文字
REGEXP_REPLACE("[email protected]", r"[^@]", "X"),
REGEXP_REPLACE("www.sample.com/products/", r"(^.+\.com)", "sample.jp"),
REGEXP_REPLACE("www.sample.ac.jp/products/", r"(^.+\.com)", "sample.jp");
f0_ | f1_ | f2_ | f3_ | f4_ | |
---|---|---|---|---|---|
1 | [email protected] | [email protected] | XXX@XXXXXXXXX | sample.jp/products/ | www.sample.ac.jp/products/ |
■日時、日付に対する基本的な関数
| DATE()、DATETIME() - DATE型(DATETIME型)
e.g.
DATE(2021, 9, 30) --2021/09/30
DATETIME(2021,9,30,12,35,15) --2021/09/30 12:35:15
ex.【6.7 演習問題1(1:50)】
SELECT
DATE(2019, 4, 30) AS date,
DATETIME(2019, 4, 30, 13, 22, 15) AS datetime;
-- | |date |datetime |
-- |1|2019-04-30|2019-04-30T13:22:15|
(型確認:スキーマ)
実行後 -> ジョブ情報(結果画面横)-> 一時テーブル(ページ最下部)-> テーブルスキーマーを確認。
|フィールド名|種類 |モード |
|date |DATE |NULLABLE|
|datetime |DATETIME |NULLABLE|
ex.【6.7 演習問題2(4:30)】
SELECT
purchase_id,
DATETIME(date) AS datetime
FROM `prj-test3.bq_sample.shop_purchases`
ORDER BY purchase_id
LIMIT 10;
-- | |purchase_id|datetime |
-- |1| 1|2018-01-01T00:00:00|
ex.【6.7 演習問題3(5:30)】
SELECT
timestamp,
DATE(timestamp) AS date
FROM `prj-test3.bq_sample.web_usage`
ORDER BY 1
LIMIT 100;
-- | |timestamp |date |
-- |1|2018-01-01T13:12:57|2018-01-01|
| CURRENT_DATE()、CURRENT_DATETIME() - 現在データの取得
e.g. ※ 現在時刻をUTC(協定世界時:日本より9時間前)で取得する。
SELECT
CURRENT_DATE("+09:00"),
CURRENT_DATETIME("+09:00");
ex.【6.7 演習問題5(9:15)】
SELECT
CURRENT_DATE("Asia/Tokyo"),
CURRENT_DATETIME("Asia/Tokyo");
| DATE_ADD()、DATETIME_ADD() - 追加
e.g.
DATE_ADD(date_expr, INTERVAL int64_expr date_part)
/*2019年5月3日に3週間を加算する。*/
SELECT DATE_ADD(date"2019-05-03", INTERVAL 3 week);
(date_part)
※ DATE : date_part = [yera, quarter, month, week, day]
※ DATETIME: date_part = [yera, quarter, month, week, day]
+[hour, minute , second, milisecond, microsecond]
ex.【6.8 演習問題1(2:15)】
SELECT
DATE_ADD(CURRENT_DATE("Asia/Tokyo"), INTERVAL 3 month);
-- | |f0_ |
-- |1|2021-12-6|
(memo) 例えば、3ヶ月前とかも取れる。その場合は「-3」
ex.【6.8 演習問題2(3:50)】
SELECT DATETIME_ADD(CURRENT_DATETIME("+9:00"), INTERVAL 6 hour);
-- | |f0_ |
-- |1|2021-09-07T04:21:28.704252|
| DATE_SUB(), DATETIME_SUB() - 差し引く
e.g.
SELECT DATE_SUB(date_expr, INTERVAL int64_expr date_part);
| DATE_DIFF()、DATETIME_DIFF() - 差分
e.g.
SELECT DATE_DIFF(date_expr, date_expr, date_part);
ex.【6.8 演習問題3(6:30)】
SELECT DATE_DIFF(date"2019-04-30", date"1989-01-08", day);
-- | |f0_ |
-- |1|11069|
ex.【6.8 演習問題4(7:30)】
SELECT DATETIME_DIFF(datetime"2019-05-02T10:12:15", datetime"2019-05-02T09:45:23", second);
-- | |f0_ |
-- |1|1612|
| DATE_TRUNC(), DATETIME_TRUNC() - 切り詰める
(=Truncate)
e.g.
SELECT DATE_TRUNC(date_expr, date_part)
SELECT DATE_TRUNC("1989-01-15", month);
f0_ | |
---|---|
1 | 1989-01-01 |
↑月以降は切り詰められている
SELECT DATETIME_TRUNC("1989-05-02 06:39:25", day);
f0_ | |
---|---|
1 | 1989-05-02 0:00:00 |
日付以降は切り詰められている
ex.【6.9 演習問題1(2:10)】
SELECT
DATE_TRUNC(date, MONTH) AS month,
SUM(sales_amount) AS total_sales
FROM `prj-test3.bq_sample.shop_purchases`
GROUP BY 1
ORDER BY 1;
-- | |month |total_sales|
-- |1|2018-01-01| 2056764|
-- |2|2018-02-01| 1133128|
| FORMAT_DATE(), FORMAT_DATETIME() - 出力フォーマット
e.g.
SELECT FORMAT_DATE(format_string, date);
SELECT
FORMAT_DATE("%F", "2019-05-02") AS F_upper,
FORMAT_DATE("%x", "2019-05-02") AS x_lower,
FORMAT_DATE("%Y", "2019-05-02") AS Y_upper,
FORMAT_DATE("%y", "2019-05-02") AS y_lower,
FORMAT_DATE("%m", "2019-05-02") AS m_lower,
FORMAT_DATE("%d", "2019-05-02") AS d_lower,
FORMAT_DATE("%A", "2019-05-02") AS A_upper,
FORMAT_DATE("%a", "2019-05-02") AS a_lower,
FORMAT_DATE("%B", "2019-05-02") AS B_upper,
FORMAT_DATE("%b", "2019-05-02") AS b_lower;
F_upper | x_lower | Y_upper | y_lower | m_lower | d_lower | A_upper | a_lower | B_upper | b_lower | |
---|---|---|---|---|---|---|---|---|---|---|
1 | 2019-05-02 | 05/02/19 | 2019 | 19 | 05 | 02 | Thursday | Thu | May | May |
SELECT
FORMAT_DATETIME("%c", "2019-05-02 09:29:41") AS c_lower,
FORMAT_DATETIME("%r", "2019-05-02 09:29:41") AS r_lower,
FORMAT_DATETIME("%X", "2019-05-02 09:29:41") AS X_upper,
FORMAT_DATETIME("%H", "2019-05-02 09:29:41") AS H_upper,
FORMAT_DATETIME("%M", "2019-05-02 09:29:41") AS M_upper,
FORMAT_DATETIME("%S", "2019-05-02 09:29:41") AS S_upper,
FORMAT_DATETIME("%P", "2019-05-02 09:29:41") AS P_upper,
FORMAT_DATETIME("%s", "2019-05-02 09:29:41") AS s_lower,
FORMAT_DATETIME("%p", "2019-05-02 09:29:41") AS p_lower;
c_lower | r_lower | X_upper | H_upper | M_upper | S_upper | P_upper | s_lower | p_lower | |
---|---|---|---|---|---|---|---|---|---|
1 | Thu May 2 09:29:41 2019 | 09:29:41 AM | 09:29:41 | 09 | 29 | 41 | am | 1556789381 | AM |
| MAX(), MIN() - 最大値、最小値
ex.【6.9 演習問題2(4:00)】
SELECT
shop_id,
-- MIN(DATE_TRUNC(date, DAY)) AS oldest,
-- MAX(DATE_TRUNC(date, DAY)) AS newest,
-- MAX(DATE_TRUNC(date, DAY))-MIN(DATE_TRUNC(date, DAY)) AS days_diff
MIN(date) AS oldest,
MAX(date) AS newest,
DATE_DIFF(MAX(date), MIN(date), DAY) AS days_diff
FROM `prj-test3.bq_sample.shop_purchases`
WHERE shop_id = 4
GROUP BY shop_id;
-- | |shop_id|oldest |newest |days_diff|
-- |1| 4|2018-01-05|2018-12-19| 348|
ex.【6.9 演習問題3(9:00)】
#(miss code)
-- SELECT
-- user_id,
-- MIN(DATETIME_TRUNC(timestamp, DAY)) AS oldest,
-- MAX(DATETIME_TRUNC(timestamp, DAY)) AS newest,
-- DATETIME_DIFF(
-- MAX(DATETIME_TRUNC(timestamp, DAY)),
-- MIN(DATETIME_TRUNC(timestamp, DAY)),
-- DAY) AS days_diff,
-- session_count
-- -- AVG() AS avg_visit
-- FROM `prj-test3.bq_sample.web_usage`
-- GROUP BY user_id, session_count
-- HAVING DATETIME_DIFF(
-- MAX(DATETIME_TRUNC(timestamp, DAY)),
-- MIN(DATETIME_TRUNC(timestamp, DAY)),
-- DAY) > 1
-- ORDER BY days_diff;
#(collect_code)
SELECT
user_id,
MIN(timestamp) AS oldest,
MAX(timestamp) AS newest,
DATETIME_DIFF(MAX(timestamp), MIN(timestamp), DAY) AS days_diff,
COUNT(DISTINCT session_count) AS visit_count, --[重複session数を除いて、ユニークなsession数を取得]
DATETIME_DIFF(MAX(timestamp), MIN(timestamp), DAY)/COUNT(DISTINCT session_count) AS avg_interval
FROM `prj-test3.bq_sample.web_usage`
GROUP BY user_id
HAVING
DATETIME_DIFF(MAX(timestamp), MIN(timestamp), DAY) <> 0
AND COUNT(DISTINCT session_count) <> 1
ORDER BY avg_interval;
-- | |user_id|oldest |newest |days_diff|visit_count|avg_interval|
-- |1| 916550|2018-10-22T00:46:50|2018-10-23T14:34:55| 1| 8| 0.125|
-- |2|1011670|2018-10-04T18:37:15|2018-10-05T13:42:21| 1| 4| 0.25|
様々な条件式
| IF文 - 条件式
e.g.
IF(条件式, True, False)
SELECT
product_id,
prod_name,
IF(product_id >= 11, "Tシャツ", "それ以外") AS category
FROM `prj-test3.bq_sample.products_master`;
product_id | prod_name | category | |
---|---|---|---|
1 | 1 | オックスフォードシャツ 綿 100% | それ以外 |
11 | 11 | Tシャツ(デザイン) 半袖 | Tシャツ |
ex.【6.10 演習問題1(3:20)】
SELECT
IF(product_id >= 11, "Tシャツ", "Tシャツ以外") AS category,
SUM(quantity) AS total_pty
FROM `prj-test3.bq_sample.shop_purchases`
GROUP BY 1;
-- | |category |total_qty|
-- |1|Tシャツ以外 | 1156|
-- |2|Tシャツ | 1739|
| IFNULL文 - nullに対しての条件式
e.g. nullの時に発動(※ 値がnullでないなら何もしない)
IFNULL(かラム名, nullの場合の返り値)
cf. 値がNULLだった場合は指定した別の値を返す(ifnull関数, coalesce関数) - DBOnline
ex.【6.10 演習問題2(5:20)】
SELECT
*,
IFNULL(gender, 3) AS gender_not_null
FROM `prj-test3.bq_sample.customers`
ORDER BY 1;
-- | |user_id||gender|~|gender_not_null|
-- |1| 496070|| 1|~| 1|
-- |7| 596992||null |~| 3|
| CASE文 - 条件式
e.g.
CASE (判定条件) --Bool判定式では記載無いこともある
WHEN 値 THEN 値が合致した場合の戻り値
WHEN 値 THEN 値が合致した場合の戻り値
WHEN 値 THEN 値が合致した場合の戻り値
ELSE いずれにも合致しなかった場合の戻り値
END
SELECT
user_id,
gender,
CASE gender
WHEN 1 THEN "男性"
WHEN 2 THEN "女性"
ELSE "不明"
END AS gender_name
FROM `prj-test3.bq_sample.customers`
ORDER BY 1;
user_id | gender | gender_name | |
---|---|---|---|
1 | 496070 | 1 | 男性 |
2 | 497520 | 2 | 女性 |
7 | 596992 | null | 不明 |
SELECT
user_id,
prefecture,
CASE
WHEN REGEXP_CONTAINS(prefecture, r"Tokyo|Kanawa") THEN "東京他" -- |:または
WHEN REGEXP_CONTAINS(prefecture, r"Osaka|Hyogo") THEN "大阪他"
ELSE "その他"
END AS pref_category
FROM `prj-test3.bq_sample.customers`
ORDER BY 1;
user_id | prefecture | pref_category | |
---|---|---|---|
1 | 496070 | Tokyo | 東京他 |
4 | 529710 | Fukuoka | その他 |
9 | 597427 | Hyogo | 大阪他 |
ex.【6.11 演習問題1(6:30)】
-- SELECT
-- sales_amount,
-- ROUND(sales_amount, -3)
-- FROM `prj-test3.bq_sample.shop_purchases`;
#(miss_code)
-- SELECT
-- purchase_id,
-- sales_amount,
-- CASE
-- WHEN ROUND(sales_amount, -3) = 0 THEN "1万円未満"
-- WHEN ROUND(sales_amount, -3) = 10000 THEN "1万円"
-- WHEN ROUND(sales_amount, -3) = 20000 THEN "2万円"
-- ELSE "3万円以上"
-- END AS round_sales
-- FROM `prj-test3.bq_sample.shop_purchases`
-- ORDER BY 1;
#(collect_code)
SELECT
purchase_id,
sales_amount,
CASE ROUND(sales_amount, -4)
WHEN 0 THEN "1万円未満"
WHEN 10000 THEN "1万円"
WHEN 20000 THEN "2万円"
ELSE "3万円以上"
END AS round_sales
FROM `prj-test3.bq_sample.shop_purchases`;
-- | |purchase_id|sales_amount|round_sales|
-- | 1| 22| 59400|3万円以上 |
-- | 5| 17| 19000|2万円 |
-- |74| 335| 12580|1万円 |
ex.【6.11 演習問題2(11:30)】
#(miss_code)
-- SELECT
-- CASE product_id
-- WHEN 1 BETWEEN 6 THEN "男性衣類"
-- WHEN 7 BETWEEN 10 THEN "女性衣類"
-- WHEN 11 BETWEEN 18 THEN "Tシャツ"
-- WHEN IN(19, 20) THEN "子供用Tシャツ"
-- ELSE "不明"
-- END AS prod_category,
-- AVG(sales_amount) AS avg_amount
-- FROM `prj-test3.bq_sample.shop_purchases`
-- GROUP BY prod_category
-- ORDER BY 2;
#(colect code)
SELECT
CASE
WHEN product_id <= 6 THEN "男性衣類"
WHEN product_id <= 10 THEN "女性衣類"
WHEN product_id <= 18 THEN "Tシャツ"
ELSE "子供用Tシャツ"
END AS prod_category,
ROUND(AVG(sales_amount), 2)AS avg_amount
FROM `prj-test3.bq_sample.shop_purchases`
GROUP BY 1
ORDER BY 2 DESC;
-- | |prod_category|avg_amount|
-- |1|男性衣類 | 30074.72|
-- |2|女性衣類 | 24052.13|