LoginSignup
0
0

More than 1 year has passed since last update.

SQLデータサイエンス100本ノック(記録)21〜40

Posted at

問21 

S-021: レシート明細データ(receipt)に対し、件数をカウントせよ。

SELECT COUNT(*) FROM receipt

問22 

S-022:レシート明細テーブル(receipt)の顧客ID(customer_id)に対し、
ユニーク件数をカウントせよ。

SELECT COUNT(DISTINCT customer_id) FROM receipt;

問23 

S-023:レシート明細テーブル(receipt)に対し、店舗コード(store_cd)ごとに
売上金額(amount)と売上数量(quantity)を合計せよ。

SELECT store_cd, SUM(amount) AS sum_amount, SUM(quantity) AS sum_quantity
FROM receipt GROUP BY store_cd;

問24 

S-024: レシート明細データ(receipt)に対し、顧客ID(customer_id)ごとに最も新しい売上年月日(sales_ymd)を求め、10件表示せよ。

SELECT customer_id, MAX(sales_ymd) AS max_sales_ymd
FROM receipt
GRROUP BY customer_id
LIMIT 10;

問25 

S-025:レシート明細テーブル(receipt)に対し、顧客ID(customer_id)ごとに
最も古い売上日(sales_ymd)を求め、10件表示せよ。

SELECT customer_id, MIN(sales_ymd) AS min_sales_ymd
FROM receipt
GROUP BY customer_id
LIMIT 10;

問26 

S-026:レシート明細テーブル(receipt)に対し、顧客ID(customer_id)ごとに
最も新しい売上日(sales_ymd)と古い売上日を求め、両者が異なるデータを10件表示せよ。

SELECT customer_id, MAX(sales_ymd) AS max_sales_ymd, 
MIN(sales_ymd) as min_sales_ymd 
FROM receipt GROUP BY customer_id
HAVING MAX(sales_ymd) != MIN(sales_ymd)
LIMIT 10;

問27 

S-027:レシート明細テーブル(receipt)に対し、店舗コード(store_cd)ごとに
売上金額(amount)の平均を計算し、降順でTOP5を表示せよ。

SELECT store_cd, AVG(amount) AS avg_amount
FROM receipt GROUP BY store_cd
ORDER BY avg_amount DESC 
LIMIT 5;

問28 

S-028:レシート明細テーブル(receipt)に対し、店舗コード(store_cd)ごとに
売上金額(amount)の中央値を計算し、降順でTOP5を表示せよ。

SELECT store_cd,
PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY amount) as median
FROM receipt
GROU BY store_cd
ORDER BY median desc
LIMIT 5;

問29 

S-029:レシート明細テーブル(receipt)に対し、店舗コード(store_cd)ごとに
商品コードの最頻値を求めよ。

SELECT store_cd,
MODE() WITHIN GROUP (ORDER BY product_cd)
FROM receipt
GROUP BY store_cd;

問30 

S-030:レシート明細テーブル(receipt)に対し、店舗コード(store_cd)ごとに
売上金額(amount)の標本分散を計算し、降順にTOP5を表示せよ。

SELECT store_cd,
VAR_SAMP(amount) AS var_amount
FROM receipt
GROUP BY store_cd
ORDER BY var_amount DESC
LIMIT 5;

問31 

S-031:レシート明細テーブル(receipt)に対し、店舗コード(store_cd)ごとに
売上金額(amount)の標本標準偏差を計算し、降順にTOP5を表示せよ。

SELECT store_cd,
STDDEV_SAMP(amount) AS std_amount
FROM receipt
GROUP BY store_cd
ORDER BY std_amount DESC
LIMIT 5;

問32 

S-032:レシート明細テーブル(receipt)に対し、
売上金額(amount)について25%刻みでパーセンタイル値を求めよ。

SELSECT PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY amount) AS per_25,
PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY amount) AS per_50,
PERCENTILE_CONT(0.75) WITHIN GROUP (order by amount) AS per_75,
PERCENTILE_CONT(1.0) WITHIN GROUP (order by amount) AS per_100
FROM receipt;

問33 

S-033:レシート明細テーブル(receipt)に対し、店舗コード(store_cd)ごとに
売上金額(amount)の平均を計算し、330以上のものを抽出せよ。

SELECT store_cd,
AVG(amount) AS avg_amount
FROM receipt
GROUP BY store_cd
HAVING AVG(amount) >= 330;

問34 

S-034:レシート明細テーブル(receipt)に対し、顧客ID(customer_id)ごとに
売上金額(amount)を合計して全顧客の平均を求めよ。ただし、顧客IDが"Z"から始まるのものは非会員を表すため、除外して計算すること。

WITH customer_amount AS (
                          SELECT customer_id,
                                 SUM(amount) AS sum_amount
                          FROM receipt
                          WHERE customer_id NOT LIKE 'Z%'
                          GROUP BY customer_id
                         )
SELECT AVG(sum_amount)
FROM customer_amount;

問35 

S-035:レシート明細テーブル(receipt)に対し、顧客ID(customer_id)ごとに販売金額(amount)を合計して全顧客の平均を求め、平均以上に買い物をしている顧客を抽出せよ。
ただし、顧客IDが"Z"から始まるのものは非会員を表すため、除外して計算すること。
なお、データは10件だけ表示させれば良い。

WITH customer_amount AS (
                          SELECT customer_id,
                                 SUM(amount) AS sum_amount
                          FROM receipt
                          WHERE customer_id NOT LIKE 'Z%'
                          GROUP BY customer_id
                         )
SELECT customer_id,
        sum_amount
FROM customer_amount
WHERE sum_amount >= (SELECT AVG(sum_amount) FROM customer_amount)
LIMIT 10;

問36 

S-036:レシート明細テーブル(receipt)と店舗テーブル(store)を内部結合し、
レシート明細テーブルの全項目と店舗テーブルの店舗名(store_name)を10件表示せよ。

SELECT r.*, s.store_name
FROM receipt r
JOIN store s
ON r.store_cd = s.store_cd
LIMIT 10;

問37 

S-037: 商品テーブル(product)とカテゴリテーブル(category)を内部結合し、商品テーブルの全項目とカテゴリテーブルの小区分名(category_small_name)を10件表示させよ。

SELECT p.*, c.category_small_name
FROM product p
JOIN category c
ON p.category_small_cd = c.category_small_cd
LIMIT 10;

問38 

S-038: 顧客テーブル(customer)とレシート明細テーブル(receipt)から、各顧客ごとの売上金額合計を求めよ。ただし、買い物の実績がない顧客については売上金額を0として表示させること。また、顧客は性別コード(gender_cd)が女性(1)であるものを対象とし、非会員(顧客IDが'Z'から始まるもの)は除外すること。なお、結果は10件だけ表示させれば良い。

WITH customer_amount AS (
    SELECT customer_id, SUM(amount) AS sum_amount
    FROM receipt
    GROUP BY customer_id
)
SELECT c.customer_id, COALESCE(a.sum_amount,0)
FROM customer c
LEFT JOIN customer_amount a
ON c.customer_id = a.customer_id
WHERE c.gender_cd = '1'
      and c.customer_id not like 'Z%'
LIMIT 10;

問39 

S-039: レシート明細テーブル(receipt)から売上日数の多い顧客の上位20件と、売上金額合計の多い顧客の上位20件を抽出し、完全外部結合せよ。ただし、非会員(顧客IDが'Z'から始まるもの)は除外すること。

WITH customer_days AS (
    select customer_id, COUNT(DISTINCT sales_ymd) come_days
    FROM receipt
    WHERE customer_id NOT LIKE 'Z%'
    GROUP BY customer_id
    ORDER BY come_days DESC LIMIT 20
),
customer_amount AS (
    SELECT customer_id, SUM(amount) buy_amount
    FROM receipt 
    WHERE customer_id NOT LIKE 'Z%'
    GROUP BY customer_id
    ORDER BY buy_amount DESC LIMIT 20
)
SELECT COALESCE(d.customer_id, a.customer_id), d.come_days, a.buy_amount
FROM customer_days d
FULL JOIN customer_amount a
ON d.customer_id = a.customer_id;

問40 

S-040: 全ての店舗と全ての商品を組み合わせると何件のデータとなるか調査したい。店舗(store)と商品(product)を直積した件数を計算せよ。

SELECT COUNT(1) FROM store CROSS JOIN product;
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0