๊ด€๋ฆฌ ๋ฉ”๋‰ด

OkBublewrap

2025-01-10 TIL (QCC ๋ฆฌ๋ทฐ) ๋ณธ๋ฌธ

Today I Learning

2025-01-10 TIL (QCC ๋ฆฌ๋ทฐ)

์˜ฅ๋ฝ๋ฝ 2025. 1. 10. 12:59

๐Ÿ‘€ ์•„๋‹ˆ!!? ์–ธ์ œ ๋“ฑ์žฌ ๋˜์—ˆ์–ด..!

๋Œ€ํ™” ๋ถ„์„์„ ํ†ตํ•œ ์‚ฌํšŒ์ •์„œ์—ญ๋Ÿ‰ ์ธก์ • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ - ChatGPT API๋ฅผ ์ด์šฉํ•˜์—ฌ -

 

๋Œ€ํ™” ๋ถ„์„์„ ํ†ตํ•œ ์‚ฌํšŒ์ •์„œ์—ญ๋Ÿ‰ ์ธก์ • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ - ChatGPT API๋ฅผ ์ด์šฉํ•˜์—ฌ -

์—ฐ๊ตฌ๋ชฉ์ : ์ด ์—ฐ๊ตฌ์˜ ๋ชฉ์ ์€ ๊ฑฐ๋Œ€ ์–ธ์–ด ๋ชจ๋ธ์˜ ๋Œ€ํ‘œ์  ChatGPT๋ฅผ ์ด์šฉํ•˜์—ฌ ๋Œ€ํ™” ๋ถ„์„์„ ํ†ตํ•œ ์‚ฌํšŒ์ •์„œ์—ญ๋Ÿ‰ ์ธก์ • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฐ€๋Šฅ์„ฑ์„ ํƒ์ƒ‰ํ•˜๋Š” ํ”„๋กœํ† ํƒ€์ž…์„ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์—ฐ๊ตฌ ๋ฐฉ๋ฒ•: ์ด

www.kci.go.kr

 

์‚ด๋‹ค๋ณด๋‹ˆ ์ด๋Ÿฐ์ผ์ด ์ƒ๊ธฐ๋Š”๊ตฌ๋‚˜, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœํ† ํƒ€์ž… ๋ถ€๋ถ„ ์ค‘ ์ด์  ๋งคํ•‘, ์‹œ๊ฐํ™” ๋ถ€๋ถ„์„ ๋‹ด๋‹น ํ–ˆ๋Š”๋ฐ ๋…ผ๋ฌธ์— ๋“ฑ์žฌ๋˜๋‹ค๋‹ˆ..

์ •๋ง ์‹ ๊ธฐํ•œ ๊ฒฝํ—˜์ธ ๊ฒƒ ๊ฐ™๋‹ค. ์•„๋ฌดํŠผ ๊ฐ๊ฐœ๋ฌด๋Ÿ‰ํ•ฉ๋‹ˆ๋‹ค!!!

 

QCC ๋ฆฌ๋ทฐ

๋ฌธ์ œ 1 : ์ฒซ ์ฃผ๋ฌธ ๊ณ ๊ฐ ์—ฐ๋„๋ณ„ ๋งค์ถœ ์กฐํšŒ

1. 2011๋…„ 12์›”์— ์ฒซ ์ฃผ๋ฌธ์„ ํ•œ ๊ณ ๊ฐ๋“ค์˜ ์—ฐ๋„๋ณ„ ๋งค์ถœ

2. ๊ณ ๊ฐ ID ์˜ค๋ฆ„์ฐจ์ˆœ, ์—ฐ๋„ ์˜ค๋ฆ„์ฐจ์ˆœ

 

๋ฌธ์ œ 1 ํ’€์ด

-- 1.2011๋…„ 12์›”์— ์ฒซ ์ฃผ๋ฌธํ•œ ๊ณ ๊ฐ
SELECT customerid
FROM sales_order
GROUP BY customerid
HAVING year(min(CAST(orderdate AS date))) = '2011'
	AND month(min(CAST(orderdate AS date))) = '12'

 

customerid์„ ๊ทธ๋ฃนํ™” ํ•ด์„œ ๊ฐ€์žฅ ์ž‘์€ ๋‚ ์งœ์ธ์ด 2011๋…„ 12์›”์ธ ๊ณ ๊ฐ ๊ฐ€์ ธ์˜ค๊ธฐ

 

-- 2.2011๋…„ 12์›”์— ์ฒซ ์ฃผ๋ฌธํ•œ ๊ณ ๊ฐ ์ฃผ๋ฌธ ๋‚ด์—ญ
SELECT s.customerid, unitprice * orderqty AS totalprice, left(s.orderdate, 4) AS year
FROM sales_order s
WHERE customerid IN 
	(
		SELECT customerid
		FROM sales_order
		GROUP BY customerid
		HAVING year(min(CAST(orderdate AS date))) = '2011'
			AND month(min(CAST(orderdate AS date))) = '12'
	)

 

ํ•ด๋‹น ๊ณ ๊ฐ๋“ค์˜ ์ฃผ๋ฌธ๊ฐ€์ ธ์˜ค๊ธฐ totalprice๋กœ ์ด๊ธˆ์•ก ๊ณ„์‚ฐ

 

-- 3. ์—ฐ๋„๋ณ„ ๊ณ„์‚ฐ
SELECT s.customerid, left(s.orderdate, 4) AS year, sum(unitprice * orderqty) AS gmv
FROM sales_order s
WHERE customerid IN 
	(
		SELECT customerid
		FROM sales_order
		GROUP BY customerid
		HAVING year(min(CAST(orderdate AS date))) = '2011'
			AND month(min(CAST(orderdate AS date))) = '12'
	)
GROUP BY 1, 2

 

ํ•ด๋‹น ๊ณ ๊ฐ๋“ค์˜ ์—ฐ๋„๋ณ„๋กœ ์ง‘๊ณ„ gmv๋กœ ๊ณ„์‚ฐ

 

-- 4. ์ด๋ฆ„ ๊ฐ€์ ธ์˜ค๊ธฐ, ์ •๋ ฌ
SELECT s.customerid
	,(SELECT concat(c.firstname, ' ', c.lastname) 
		FROM customer c 
		WHERE s.customerid = c.customerid) AS customer_name
	, CAST(left(s.orderdate, 4) AS UNSIGNED) AS year
	, sum(unitprice * orderqty) AS gmv
FROM sales_order s
WHERE customerid IN 
	(
		SELECT customerid
		FROM sales_order
		GROUP BY customerid
		HAVING year(min(CAST(orderdate AS date))) = '2011'
			AND month(min(CAST(orderdate AS date))) = '12'
	)
GROUP BY s.customerid, CAST(left(s.orderdate, 4) AS UNSIGNED)
ORDER BY s.customerid, CAST(left(s.orderdate, 4) AS UNSIGNED);

 

์ƒ๊ด€ ์„œ๋ธŒ์ฟผ๋ฆฌ๋กœ ํ•ด๋‹น ์ด๋ฆ„ ๊ฐ€์ ธ์˜ค๊ณ  ์ •๋ ฌ

 

 

๋ฌธ์ œ 2

๋ฌธ์ œ 2 ํ’€์ด

1. ๋‚ ์งœ ๊ตฌ๊ฐ„์„ ์‚ฌ์šฉํ•œ ๊ณ„์‚ฐ

-- 1. 2011-12 ์ฒซ ๊ตฌ๋งค ์‚ฌ์šฉ์ž ํ…Œ์ด๋ธ” ๊ฐ€์ ธ์˜ค๊ธฐ
SELECT s.customerid,
    CAST(left(s.orderdate, 4) AS UNSIGNED) AS year, 
    sum(s.orderqty * s.unitprice) AS gmv
FROM sales_order s
WHERE customerid IN 
(
    SELECT customerid
    FROM sales_order
    GROUP BY customerid 
    HAVING min(orderdate) like '2011-12%'
)
GROUP BY s.customerid, left(s.orderdate, 4)
ORDER BY 1, 2

 

๋ฌธ์ œ 1์— ์‚ฌ์šฉํ–ˆ๋˜ ํ…Œ์ด๋ธ” ์‚ฌ์šฉ

 

-- 2 ์ง‘๊ณ„ ๊ณ„์‚ฐ
temp_02 AS (
	SELECT customerid, round(sum(gmv) / (max(year) - min(year) + 1),2) AS avg_yearly_gmv
	FROM temp_01 
	GROUP BY customerid
)

 

๊ตฌ๊ฐ„์„ ์ด์šฉํ•œ ์—ฐ ํ‰๊ท  ๊ณ„์‚ฐ

 

-- 3. ์ด๋ฆ„ ๋ถ™์ด๊ธฐ, ์ •๋ ฌ
SELECT customerid
	, (SELECT concat(c.firstname, ' ', c.lastname) 
		FROM customer c 
		WHERE t2.customerid = c.customerid) AS customer_name
	, avg_yearly_gmv
FROM temp_02 t2
ORDER BY customerid ASC;

์ถœ๋ ฅ์— ๋งž๋Š” ์ด๋ฆ„, ์ •๋ ฌ ์ง„ํ–‰

 

-- ์ „์ฒด์ฝ”๋“œ
WITH temp_01 AS (
	SELECT s.customerid,
		CAST(left(s.orderdate, 4) AS UNSIGNED) AS year, 
		sum(s.orderqty * s.unitprice) AS gmv
	FROM sales_order s
	WHERE customerid IN 
	(
		SELECT customerid
		FROM sales_order
		GROUP BY customerid 
		HAVING min(orderdate) like '2011-12%'
	)
	GROUP BY s.customerid, left(s.orderdate, 4)
	ORDER BY 1, 2
),
temp_02 AS (
	SELECT customerid, round(sum(gmv) / (max(year) - min(year) + 1),2) AS avg_yearly_gmv
	FROM temp_01 
	GROUP BY customerid
)
SELECT customerid
	, (SELECT concat(c.firstname, ' ', c.lastname) 
		FROM customer c 
		WHERE t2.customerid = c.customerid) AS customer_name
	, avg_yearly_gmv
FROM temp_02 t2
ORDER BY customerid ASC;

 

2. dim_years ์‚ฌ์šฉ

-- 1. 2011-12 ๊ณ ๊ฐ์ค‘ ์ฒซ๋ฒˆ์งธ ์ฃผ๋ฌธ ์—ฐ๋„, ๋งˆ์ง€๋ง‰ ์ฃผ๋ฌธ ์—ฐ๋„ ๊ฐ€์ ธ์˜ค๊ธฐ
SELECT 
    c.customerid,
    CONCAT(c.firstname, ' ', c.lastname) customer_name,
    MIN(YEAR(s.orderdate)) first_order_year,
    MAX(YEAR(s.orderdate)) last_order_year
FROM 
    customer c
INNER JOIN sales_order s ON c.customerid = s.customerid 
GROUP BY c.customerid, customer_name
HAVING DATE_FORMAT(MIN(s.orderdate), '%Y-%m') = '2011-12'

 

customer_filtered Table

customerid custumer_name first_order_year last_order_year
11387 Megan Ramirez 2011 2013
11388 Joseph Martin 2011 2013

 

-- 2. ์ตœ์ดˆ ์ฃผ๋ฌธ ์—ฐ๋„, ๋งˆ์ง€๋ง‰ ์ฃผ๋ฌธ ์—ฐ๋„ ์‚ฌ์ด ์ฑ„์šฐ๊ธฐ
select 
    cf.customerid,
    cf.customer_name,
    d.year
from customer_filtered cf
	left join dim_years d on d.year between cf.first_order_year and cf.last_order_year

 

dim Table

year
2000
2001...

 

Between Join

customer_years Table

cf.customerid cf.custumer_name d.year
11387 Megan Ramirez 2011
11387 Megan Ramirez 2012
11387 Megan Ramirez 2013
11388 Joseph Martin 2011
11388 Joseph Martin 2012
11388 Joseph Martin 2013

 

-- 3. ๊ณ ๊ฐ๋ณ„ ์—ฐ๋„๋ณ„ ํ•ฉ๊ณ„ 
SELECT
    cy.customerid,
    cy.customer_name,
    cy.year,
    COALESCE(SUM(s.unitprice * s.orderqty),0) gmv  
FROM
    customer_years cy  
LEFT JOIN sales_order s ON cy.customerid=s.customerid AND cy.year = YEAR(s.orderdate)
GROUP BY cy.customerid, cy.customer_name, cy.year

 

customer_years ํ…Œ์ด๋ธ”์— ๊ฐ ์—ฐ๋„, ๊ณ ๊ฐ๋ฒˆํ˜ธ ๊ฒฐํ•ฉ

null ๊ฐ’ 0์œผ๋กœ

 

-- ๊ณ ๊ฐ๋ณ„ ์—ฐํ‰๊ท  ๊ณ„์‚ฐ, ์ •๋ ฌ
SELECT
	customerid,
	customer_name,
	ROUND(AVG(gmv), 2) avg_yearly_gmv
FROM 
	customer_gmv
GROUP BY customerid, customer_name
ORDER BY customerid;

 

๋งŒ๋“ค์–ด์ง„ ํ–‰์œผ๋กœ ๊ณ„์‚ฐ

 

๋ฌธ์ œ 3 : ๊ณ ๊ฐ๋ณ„ ์ตœ๋Œ€ ์ฃผ๋ฌธ ์ˆ˜๋Ÿ‰ ์—ฐ๋„์™€ ์ฃผ๋ฌธ ์ˆ˜๋Ÿ‰ ์ง‘๊ณ„

1. 2011๋…„ 12์›”์— ์ฒซ ์ฃผ๋ฌธ์„ ํ•œ ๊ณ ๊ฐ ๋Œ€์ƒ, ๊ฐ ์—ฐ๋„์—์„œ ์ฃผ๋ฌธ ์ˆ˜๋Ÿ‰ ์ง‘๊ณ„, ์ตœ๋Œ€ ์ฃผ๋ฌธ ์ˆ˜๋Ÿ‰๊ณผ ๊ทธ ์ตœ๋Œ€ ์ฃผ๋ฌธ ์ˆ˜๋Ÿ‰ ๋ฐœ์ƒ์‹œํ‚จ ์—ฐ๋„

2. ์ตœ๋Œ€ ์ฃผ๋ฌธ ์ˆ˜๋Ÿ‰์ด ๊ฐ™์€ ์—ฐ๋„๊ฐ€ ์žˆ์œผ๋ฉด, ๊ฐ€์žฅ ์ตœ๊ทผ ์—ฐ๋„ ์ถœ๋ ฅ

3. ๊ณ ๊ฐ ID ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ

 

๋ฌธ์ œ 3 ํ’€์ด

-- 1. 2011๋…„ 12์›” ์ฒซ ์ฃผ๋ฌธ์„ ํ•œ ๊ณ ๊ฐ ๊ฐ€์ ธ์˜ค๊ธฐ
SELECT *
FROM sales_order s
WHERE customerid IN 
	(
		SELECT customerid
		FROM sales_order
		GROUP BY customerid
		HAVING year(min(CAST(orderdate AS date))) = '2011'
			AND month(min(CAST(orderdate AS date))) = '12'
	)

 

๋ฌธ์ œ 1๋ฒˆ์™€ ๊ฐ™์ด ์ฒซ ์ฃผ๋ฌธ์„ ํ•œ ๊ณ ๊ฐ ์ฃผ๋ฌธ ํ…Œ์ด๋ธ” ๊ฐ€์ ธ์˜ค๊ธฐ

 

-- 2. ์—ฐ๋„๋ณ„๋กœ ์ฃผ๋ฌธ ์ˆ˜๋Ÿ‰ ์ง‘๊ณ„
SELECT s.customerid,
		CAST(left(s.orderdate, 4) AS UNSIGNED) AS year_order,
		sum(s.orderqty) AS total_qty
FROM sales_order s
WHERE customerid IN 
	(
		SELECT customerid
		FROM sales_order
		GROUP BY customerid
		HAVING year(min(CAST(orderdate AS date))) = '2011'
			AND month(min(CAST(orderdate AS date))) = '12'
	)
GROUP BY s.customerid, CAST(left(s.orderdate, 4) AS UNSIGNED)

 

๊ณ ๊ฐ ์•„์ด๋ณ„ ์—ฐ๋„๋ณ„ ์ฃผ๋ฌธ ์ˆ˜๋Ÿ‰ ์ง‘๊ณ„

 

-- 3. ์—ฐ๋„๋ณ„๋กœ ์ฃผ๋ฌธ ์ˆ˜๋Ÿ‰ ์ง‘๊ณ„ ์ˆœ์„œ ๋งค๊ธฐ๊ธฐ
WITH temp_01 AS (
	SELECT s.customerid,
			CAST(left(s.orderdate, 4) AS UNSIGNED) AS year_order,
			sum(s.orderqty) AS total_qty
	FROM sales_order s
	WHERE customerid IN 
		(
			SELECT customerid
			FROM sales_order
			GROUP BY customerid
			HAVING year(min(CAST(orderdate AS date))) = '2011'
				AND month(min(CAST(orderdate AS date))) = '12'
		)
	GROUP BY s.customerid, CAST(left(s.orderdate, 4) AS UNSIGNED)
)
SELECT *, 
	RANK() OVER (PARTITION BY customerid ORDER BY total_qty desc, year_order desc) AS rk
FROM temp_01

 

๊ณ ๊ฐ์•„์ด๋””๋ณ„ ๊ทธ๋ฃน, ์ฃผ๋ฌธ๊ฑด์ˆ˜ ๋‚ด๋ฆผ์ฐจ์ˆœ ๊ฐ™์œผ๋ฉด ์—ฐ๋„ ๋‚ด๋ฆผ์ฐจ์ˆœ -- ์กฐ๊ฑด 2

 

-- 4. ์—ฐ๋„๋ณ„๋กœ ์ฃผ๋ฌธ ์ˆ˜๋Ÿ‰ ์ง‘๊ณ„ ์ˆœ์„œ ๋งค๊ธฐ๊ธฐ
WITH temp_01 AS (
	SELECT s.customerid,
			CAST(left(s.orderdate, 4) AS UNSIGNED) AS year_order,
			sum(s.orderqty) AS total_qty
	FROM sales_order s
	WHERE customerid IN 
		(
			SELECT customerid
			FROM sales_order
			GROUP BY customerid
			HAVING year(min(CAST(orderdate AS date))) = '2011'
				AND month(min(CAST(orderdate AS date))) = '12'
		)
	GROUP BY s.customerid, CAST(left(s.orderdate, 4) AS UNSIGNED)
),
temp_02 AS (
	SELECT *, 
		RANK() OVER (PARTITION BY customerid ORDER BY total_qty desc, year_order desc) AS rk
	FROM temp_01
)
SELECT t2.customerid, 
	(SELECT concat(firstname, ' ', lastname) 
	FROM customer c 
	WHERE t2.customerid = c.customerid) AS customer_name,
	t2.year_order AS max_qty_year,
	t2.total_qty AS max_total_qty
FROM temp_02 t2
WHERE rk = 1
ORDER by t2.customerid

 

๊ฐ€์žฅ ๋†’์€ rk = 1๋งŒ ๊ฐ€์ ธ์˜ค๊ธฐ, ์ƒ๊ด€์„œ๋ธŒ์ฟผ๋ฆฌ๋กœ ์ด๋ฆ„ ๊ฐ€์ ธ์˜ค๊ธฐ, ๊ณ ๊ฐ์•„์ด๋””๋กœ ์ •๋ ฌ