๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ›‹๏ธ ๋ฐ์ดํ„ฐ ๋ถ„์„/๐Ÿชก SQL QUERY TEST

[Solvesql] ๋ฐ์ดํ„ฐ๋ฆฌ์•ˆ SQL ์บ ํ”„ ์‹ค์ „๋ฐ˜ ๊ณต๊ฐœ๋ฌธ์ œ/์ •๋‹ต ๋ชจ์Œ

by ์œ ์Šค :) 2024. 12. 8.
๋ฐ˜์‘ํ˜•

 

๋ชฉ์ฐจ

    [โ˜†โ˜†] ๋‹ค์Œ๋‚ ๋„ ์„œ์šธ์ˆฒ์˜ ๋ฏธ์„ธ๋จผ์ง€ ๋†๋„๋Š” ๋‚˜์จ ๐Ÿ˜ข

    ์„œ์šธ์ˆฒ ์ผ๋ณ„ ํ‰๊ท  ๋Œ€๊ธฐ์˜ค์—ผ๋„ ๋ฐ์ดํ„ฐ์…‹์€ 2022๋…„ ์„œ์šธ์ˆฒ ๋Œ€๊ธฐ์˜ค์—ผ๋„ ์ธก์ •์†Œ์—์„œ ๋งค์ผ ๊ธฐ๋กํ•œ ๋Œ€๊ธฐ์˜ค์—ผ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

    measurements ํ…Œ์ด๋ธ”์˜ pm10 ์ปฌ๋Ÿผ์—๋Š” ๋‹ค์–‘ํ•œ ๋Œ€๊ธฐ์˜ค์—ผ๋„ ์ธก์ • ๊ธฐ์ค€ ์ค‘์—์„œ๋„ ๋ฏธ์„ธ๋จผ์ง€(PM10) ๋†๋„๊ฐ€ ๊ธฐ๋ก๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋‹น์ผ์˜ ๋ฏธ์„ธ๋จผ์ง€ ๋†๋„๋ณด๋‹ค ๋ฐ”๋กœ ๋‹ค์Œ๋‚ ์˜ ๋ฏธ์„ธ๋จผ์ง€ ๋†๋„๊ฐ€ ๋” ์•ˆ์ข‹์€ ๋‚ ์„ ์ฐพ์•„์ฃผ์„ธ์š”. ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜ ์ปฌ๋Ÿผ๋“ค์„ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    • today: ๋‹น์ผ (YYYY-MM-DD)
    • next_day: ๋‹ค์Œ๋‚  (YYYY-MM-DD)
    • pm10: ๋‹น์ผ์˜ ๋ฏธ์„ธ๋จผ์ง€ ๋†๋„
    • next_pm10: ๋‹ค์Œ๋‚ ์˜ ๋ฏธ์„ธ๋จผ์ง€ ๋†๋„
    SELECT
      strftime('%Y-%m-%d', m1.measured_at) AS today,
      strftime('%Y-%m-%d', m2.measured_at) AS next_day,
      m1.pm10 AS pm10,
      m2.pm10 AS next_pm10
    FROM
      measurements m1
      join measurements m2 on m1.measured_at = date(m2.measured_at, '-1 day')
    WHERE
      m2.pm10 > m1.pm10

     

     

    [โ˜†โ˜†โ˜†โ˜†โ˜†] ์นดํ…Œ๊ณ ๋ฆฌ ๋ณ„ ๋งค์ถœ ๋น„์œจ

    US E-Commerce Records 2020 ๋ฐ์ดํ„ฐ์…‹์€ ๋ฏธ๊ตญ ์ด์ปค๋จธ์Šค ์›น์‚ฌ์ดํŠธ์˜ ํŒ๋งค ๋ฐ์ดํ„ฐ ์ž…๋‹ˆ๋‹ค. records ํ…Œ์ด๋ธ”์—๋Š” ์–ด๋А ์˜จ๋ผ์ธ ์‡ผํ•‘๋ชฐ์˜ ์ฃผ๋ฌธ ๋ฐ์ดํ„ฐ ์ž…๋‹ˆ๋‹ค. ์ฃผ๋ฌธ๋œ ์ƒํ’ˆ์˜ ์นดํ…Œ๊ณ ๋ฆฌ(category), ์„œ๋ธŒ ์นดํ…Œ๊ณ ๋ฆฌ(sub_category), ๋งค์ถœ์•ก(sales) ๋“ฑ์˜ ์ •๋ณด๊ฐ€ ๋“ค์–ด์žˆ์Šต๋‹ˆ๋‹ค.

    ์„œ๋ธŒ ์นดํ…Œ๊ณ ๋ฆฌ ๋ณ„ ๋งค์ถœ์•ก์„ ๊ณ„์‚ฐํ•˜๊ณ  ๊ทธ ๋งค์ถœ์•ก์ด ๊ฐ ์„œ๋ธŒ ์นดํ…Œ๊ณ ๋ฆฌ๊ฐ€ ์†ํ•ด์žˆ๋Š” ์นดํ…Œ๊ณ ๋ฆฌ ์•ˆ์—์„œ ๋น„์ค‘์„ ์–ผ๋งˆ๋‚˜ ์ฐจ์ง€ํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์ „์ฒด ๋งค์ถœ์•ก์—์„œ๋Š” ๋น„์ค‘์„ ์–ผ๋งˆ๋‚˜ ์ฐจ์ง€ํ•˜๋Š”์ง€ ๊ณ„์‚ฐํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜ ์ปฌ๋Ÿผ์„ ํฌํ•จํ•ด์•ผ ํ•˜๊ณ , ๋ชจ๋“  ์ˆ˜์น˜ ๋ฐ์ดํ„ฐ๋Š” ์†Œ์ˆ˜์  ์•„๋ž˜ ์…‹์งธ ์ž๋ฆฌ์—์„œ ๋ฐ˜์˜ฌ๋ฆผ ํ•ด ๋‘˜์งธ ์ž๋ฆฌ๊นŒ์ง€ ํ‘œํ˜„ํ•ด์ฃผ์„ธ์š”.

    • category - ์นดํ…Œ๊ณ ๋ฆฌ ์ด๋ฆ„
    • sub_category - ์„œ๋ธŒ ์นดํ…Œ๊ณ ๋ฆฌ ์ด๋ฆ„
    • sales_sub_category - ์„œ๋ธŒ ์นดํ…Œ๊ณ ๋ฆฌ ๋ณ„ ๋งค์ถœ์•ก์˜ ํ•ฉ๊ณ„
    • sales_category - ์นดํ…Œ๊ณ ๋ฆฌ ๋ณ„ ๋งค์ถœ์•ก์˜ ํ•ฉ๊ณ„
    • sales_total - ์ „์ฒด ๋งค์ถœ์•ก
    • pct_in_category - ์นดํ…Œ๊ณ ๋ฆฌ ๋งค์ถœ ์ค‘ ํ•ด๋‹น ์„œ๋ธŒ ์นดํ…Œ๊ณ ๋ฆฌ ๋งค์ถœ์˜ ๋น„์œจ (%)
    • pct_in_total - ์ „์ฒด ๋งค์ถœ ์ค‘ ํ•ด๋‹น ์„œ๋ธŒ ์นดํ…Œ๊ณ ๋ฆฌ ๋งค์ถœ์˜ ๋น„์œจ (%)

    (1) OVER(PARTITION BY)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

    WITH sub AS (
        SELECT 
            category,
            sub_category,
            SUM(sales) AS sum_sales
        FROM records
        GROUP BY category, sub_category
    )
    SELECT 
        category,
        sub_category,
        ROUND(SUM(sum_sales) OVER(PARTITION BY sub_category), 2) AS sales_sub_category,
        ROUND(SUM(sum_sales) OVER(PARTITION BY category), 2) AS sales_category,
        ROUND(SUM(sum_sales) OVER(), 2) AS sales_total,
        ROUND(SUM(sum_sales) OVER(PARTITION BY sub_category) / SUM(sum_sales) OVER(PARTITION BY category) * 100, 2) AS pct_in_category,
        ROUND(SUM(sum_sales) OVER(PARTITION BY sub_category) / SUM(sum_sales) OVER() * 100, 2) AS pct_in_total
    FROM sub;

     

     

    (2) GROUP BY๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ (OVER ํ•จ์ˆ˜ X)

    WITH
      c AS (
        SELECT
          category,
          sum(sales) as sales_category
        FROM records
        GROUP BY category
      ),
      t AS (
        SELECT
          r.category,
          r.sub_category,
          ROUND(sum(r.sales), 2) as sales_sub_category,
          ROUND(c.sales_category, 2) as sales_category,
          ROUND(
            (
              SELECT
                SEUM(sales)
              FROM
                records
            ),
            2
          ) AS sales_total
        FROM
          records r JOIN c USING (category)
        GROUP BY category,sub_category
      )
    SELECT
      category,
      sub_category,
      sales_sub_category,
      sales_category,
      sales_total,
      ROUND(sales_sub_category*100/sales_category,2) AS pct_in_category,
      ROUND(sales_sub_category*100/sales_total,2) AS pct_in_total
    FROM
      t
    ๋ฐ˜์‘ํ˜•