Data scientist/SQL

SQL_함수(2)

맨사설 2021. 8. 9. 19:50
728x90

 

 SQL_Order by

 

-- ORDER BY를 활용한 관측치 정렬
SELECT 	  * 
    FROM	  world.country
    ORDER BY  SurfaceArea;
-- ORDER BY 뒤에 기준이 될 변수를 입력
-- 오름차순이 기본값

SELECT 	  * 
    FROM	  world.country
    ORDER BY  Continent, Population DESC;
-- 입력한 변수 순서대로 정렬. DESC는 각각의 변수에만 영향을 미침
-- 내림차순으로 정렬시에는 변수이름 뒤에 DESC를 추가로 입력

--Q1. sales.payments 테이블에서 2004년 1월 1일 이후 결제건으로
--연도/월, customerNumber별 결제 건수 및 amount의 합계 계산 후 
--연도/월(오름차순), amount 합의 내림차순으로 정렬
select 
	customerNumber
      , count(1) CNT
      ,sum(amount) AMT
      , DATE_FORMAT(paymentDate, '%Y-%m') DT
	from sales.payments
	where paymentDate>='2004-01-01'
	group by DT, customerNumber
	order by DT , sum(amount) DESC;

-- SELECT + FROM + WHERE + GROUP BY + ORDER BY + HAVING (기본 순서)
-- Having
-- 요약값을 기준으로 일부 결과만 출력
--Q2. sales.orderdetails 테이블에서 productCode별 
-- 관측치수(주문건수)와 quantityOrdered의 합계(주문수량합계), 
-- quantityOrdered*priceEach의 합계(주문금액합계) 계산한 것 중에서 
-- 주문건수가 25건 이상인 productCode 건만 출력
SELECT productCode,
    COUNT(1) CNT
    , SUM(quantityOrdered) AMT
    , SUM(quantityOrdered*priceEach) TOTAL
  FROM sales.orderdetails
  group by productCode
  HAVING CNT>=25;

 

Q1 결과물
Q2. 결과물

 

 

 SQL_Join

 

-- 두 테이블 병합에는 여러가지 종류가 있다.
-- from절만 사용시 모든 가능한 조합을 만듦
SELECT  T1.*, T2.*
	FROM    world.city T1, world.country T2;

SELECT  T1.*, T2.*
	FROM    world.city T1, world.country T2
    WHERE   T1.CountryCode = T2.Code;
-- 모든 가능한 조합 중 T1의 CountryCode와 T2의 Code가 일치하는 것만 출력

-- INNER JOIN 키워드를 활용한 테이블 결합
SELECT D1.*, D2.*
	FROM   sakila.actor D1
		INNER JOIN
		   sakila.customer D2
		ON D1.first_name = D2.first_name;
-- first_name이 똑같으면 무조건 붙이기
-- FROM TABLE1 [INNER|LEFT|RIGHT|FULL] JOIN TABLE2 ON TABLE1.KEY1 = TABLE2.KEY2
-- left, right, full join 모두 동일한 구조

-- 3개 이상 테이블의 결합 

SELECT 	D1.*, D2.*, D3.*
    FROM sakila.rental D1
		INNER JOIN 
		sakila.customer D2
		ON D1.customer_id = D2.customer_id
        	INNER JOIN 
		sakila.payment D3
		ON D1.rental_id = D3.rental_id;
        
-- Q3. customers 테이블의 country, orderdetails 테이블의 productCode별 
--주문건수 및 quantitiyOrdered*priceEach의 합계(주문금액합계) 계산 후 
--주문금액합계의 내림차순으로 정렬
SELECT b.country, c.productCode, 
	count(distinct a.orderNumber) CNT,
       SUM(c.quantityOrdered * c.priceEach) AMT
	FROM sales.orders a 
	     INNER JOIN sales.customers b
		 ON a.customerNumber = b.customerNumber 
           
         INNER JOIN sales.orderdetails c
         ON a.orderNumber = c.orderNumber
	
    GROUP BY b.country, c.productCode
    ORDER BY AMT DESC;

 

Q3 결과물

 

 

 SQL_Case

 

SELECT	Name, Population, 
		CASE WHEN Population <  100000 THEN 'POP_GRP_1'
                 WHEN Population < 1000000 THEN 'POP_GRP_2'
                 WHEN Population < 5000000 THEN 'POP_GRP_3'
                 WHEN Population <10000000 THEN 'POP_GRP_4'
                 WHEN Population>=10000000 THEN 'POP_GRP_5'
                 ELSE 'ETC' END AS POP_GRP
	FROM    world.city
    ORDER BY Population DESC;
    -- 모든 조건과 일치하지 않으면 NULL(결측)처리
    -- ELSE를 활용하여 나머지는 관측치에 대한 값 지정
    -- 다양한 변수와 조건문으로 변수 생성 가능

 

case의 예

 

728x90

'Data scientist > SQL' 카테고리의 다른 글

SQL_important  (0) 2021.11.07
SQL_Practice_기온 데이터 분석  (0) 2021.08.08
SQL_함수  (0) 2021.08.06
SQL_TABLE  (0) 2021.08.05
SQL_기본  (0) 2021.08.04