SQLでデータサイエンス100本ノック(記録)1~20

一般社団法人データサイエンティスト協会が公開している、
「データサイエンス100本ノック(構造化データ加工編)」を実践したので記録として残します。

# 問題
# 問１
S-001: レシート明細データ（receipt）から全項目の先頭10件を表示し、どのようなデータを保有しているか目視で確認せよ。
```php
SELECT * FROM receipt LIMIT 10
```
# 問２
S-002: レシート明細データ（receipt）から売上年月日（sales_ymd）、顧客ID（customer_id）、商品コード（product_cd）、売上金額（amount）の順に列を指定し、10件表示せよ。
```php 
SELECT sales_ymd , customer_id , product_cd , amount FROM receipt LIMIT 10
```
# 問３
 S-003: レシート明細データ（receipt）から売上年月日（sales_ymd）、顧客ID（customer_id）、商品コード（product_cd）、売上金額（amount）の順に列を指定し、10件表示せよ。ただし、sales_ymdsales_dateに項目名を変更しながら抽出すること。
```php
SELECT sales_ymd as sales_ymdsales_date , customer_id , product_cd ,
amount FROM receipt LIMIT 10 
```
# 問４　
S-004: レシート明細データ（receipt）から売上日（sales_ymd）、顧客ID（customer_id）、商品コード（product_cd）、売上金額（amount）の順に列を指定し、以下の条件を満たすデータを抽出せよ。
• 顧客ID（customer_id）が"CS018205000001"
```php 
SELECT sales_ymd as sales_date, customer_id, product_cd, amount
FROM receipt
WHERE customer_id = 'CS018205000001'
```
# 問５　
S-005: レシート明細データ（receipt）から売上日（sales_ymd）、顧客ID（customer_id）、商品コード（product_cd）、売上金額（amount）の順に列を指定し、以下の全ての条件を満たすデータを抽出せよ。
・顧客ID（customer_id）が"CS018205000001"
・売上金額（amount）が1,000以上
```php 
SELECT sales_ymd , customer_id, product_cd, amount
FROM receipt
WHERE customer_id = 'CS018205000001' AND amount >= 1000
```
# 問６　
S-006: レシート明細データ（receipt）から売上日（sales_ymd）、顧客ID（customer_id）、商品コード（product_cd）、売上数量（quantity）、売上金額（amount）の順に列を指定し、以下の全ての条件を満たすデータを抽出せよ。
・顧客ID（customer_id）が"CS018205000001"
・売上金額（amount）が1,000以上または売上数量（quantity）が5以上
```php 
SELECT sales_ymd , customer_id , product_cd , quantity , amount 
FROM receipt
WHERE customer_id = 'CS018205000001' AND (amount >= 1000 OR quantity >= 5)
```
# 問７　
S-007: レシート明細データ（receipt）から売上日（sales_ymd）、顧客ID（customer_id）、商品コード（product_cd）、売上金額（amount）の順に列を指定し、以下の全ての条件を満たすデータを抽出せよ。
・顧客ID（customer_id）が"CS018205000001"
・売上金額（amount）が1,000以上2,000以下
```php 
SELECT sales_ymd, customer_id, product_cd, amount
FROM receipt
WHERE customer_id = 'CS018205000001' AND amount BETWEEN 1000 AND 2000
```
# 問８　
S-008: レシート明細データ（receipt）から売上日（sales_ymd）、顧客ID（customer_id）、商品コード（product_cd）、売上金額（amount）の順に列を指定し、以下の全ての条件を満たすデータを抽出せよ。
・顧客ID（customer_id）が"CS018205000001"
・商品コード（product_cd）が"P071401019"以外
```php 
SELECT sales_ymd, customer_id, product_cd, amount
FROM receipt
WHERE customer_id = 'CS018205000001' AND product_cd != 'P071401019'
```
# 問９　
S-009: 以下の処理において、出力結果を変えずにORをANDに書き換えよ。
SELECT * FROM store WHERE NOT (prefecture_cd = '13' OR floor_area > 900)
```php 
SELECT * FROM store WHERE prefecture_cd != '13' AND floor_area <= 900
```
# 問１０　
S-010: 店舗データ（store）から、店舗コード（store_cd）が"S14"で始まるものだけ全項目抽出し、10件表示せよ。
```php 
SELECT * FROM store WHERE store_cd LIKE 'S14%' LIMIT 10;
```
# 問１１　
S-011: 顧客データ（customer）から顧客ID（customer_id）の末尾が1のものだけ全項目抽出し、10件表示せよ。
```php 
SELECT * FROM customer WHERE customer_id LIKE '%1' LIMIT 10
```
# 問１２　
S-012: 店舗データ（store）から、住所 (address) に"横浜市"が含まれるものだけ
全項目表示せよ。
```php 
SELECT * FROM store WHERE address LIKE '%横浜市%'
```
# 問１３　
S-013: 顧客データ（customer）から、ステータスコード（status_cd）の先頭がアルファベットのA〜Fで始まるデータを全項目抽出し、10件表示せよ。
```php 
SELECT * FROM customer WHERE status_cd ~ '^[A:F]' LIMIT 10
```
# 問１４　
S-014: 顧客データ（customer）から、ステータスコード（status_cd）の末尾が数字の1〜9で終わるデータを全項目抽出し、10件表示せよ。
```php 
SELECT * FROM customer WHERE status_cd ~ '[1-9]$' LIMIT 10
```
# 問１５　
S-015: 顧客データ（customer）から、ステータスコード（status_cd）の先頭がアルファベットのA〜Fで始まり、末尾が数字の1〜9で終わるデータを全項目抽出し、10件表示せよ。
```php 
SELECT * FROM customer WHERE status_cd ~ '^[A:F].*[1-9]$' LIMIT 10
```
# 問１６　
S-016: 店舗データ（store）から、電話番号（tel_no）が3桁-3桁-4桁のデータを全項目表示せよ。
```php 
SELECT * FROM store WHERE tel_no ~ '^[0-9]{3}-[0-9]{3}-[0-9]{4}$'
```
# 問１７　
S-017: 顧客データ（customer）を生年月日（birth_day）で高齢順にソートし、先頭から全項目を10件表示せよ。
```php 
SELECT * FROM customer ORDER BY birth_day ASC LIMIT 10
```
# 問１８　
S-018: 顧客データ（customer）を生年月日（birth_day）で若い順にソートし、先頭から全項目を10件表示せよ。
```php 
SELECT * FROM customer ORDER BY birth_day DESC LIMIT 10
```
# 問１９　
S-019: レシート明細データ（receipt）に対し、1件あたりの売上金額（amount）が高い順にランクを付与し、先頭から10件表示せよ。項目は顧客ID（customer_id）、売上金額（amount）、付与したランクを表示させること。なお、売上金額（amount）が等しい場合は同一順位を付与するものとする。
```php 
SELECT customer_id, amount, RANK() OVER(ORDER BY amount DESC) AS ranking
FROM receipt
LIMIT 10
```
# 問２０　
S-020: レシート明細データ（receipt）に対し、1件あたりの売上金額（amount）が高い順にランクを付与し、先頭から10件表示せよ。項目は顧客ID（customer_id）、売上金額（amount）、付与したランクを表示させること。なお、売上金額（amount）が等しい場合でも別順位を付与すること。
```php 
SELECT customer_id , amount , ROW_NUMBER() OVER(ORDER BY amount DESC) AS ranking
FROM receipt LIMIT 10;
```