SQL문 실습 - CASE문(1)
SQL문 실습 - CASE문(2)
이전 SQL문 실습 - CASE(1), CASE(2)에 이어서 CASE문 예제를 풀어보면서 CASE문에 대해서 알아보겠습니다.
1.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | --Use Customers table -- Select Columns: -- ContactTitle, CountryType, CustomerCount -- CountryType : -- If County is Argentina or Brazil or Mexico then 'Special Country 1' -- If County is Germany or Italy or France 'Special Country 2' -- and other country is 'ETC' -- CustomerCount : Count by ContactTitle, CountryType ------------------------------------------------------------------------ SELECT CASE WHEN Country IN ('Argentina', 'Brazil', 'Mexico') THEN 'Special Country 1' WHEN Country IN ('Germany', 'Italy', 'France') THEN 'Special Country 2' ELSE 'ETC' END CountryType ,COUNT(*) CustomerCount FROM Customers GROUP BY CASE WHEN Country IN ('Argentina', 'Brazil', 'Mexico') THEN 'Special Country 1' WHEN Country IN ('Germany', 'Italy', 'France') THEN 'Special Country 2' ELSE 'ETC' END | cs |
-- GROUP BY에 CASE문을 사용해서 'Country'가 조건에 따라서, 'Special Country 1', 'Special Country 2', 'ETC'로 데이터를 줍니다.
-- GROUP BY한 것을 SELECT해서 데이터의 갯수를 보여줍니다.
- 결과
2.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | --Use Orders table -- Select only OrderDate in 199607, 199608, 199609 -- Select Columns: -- ShipCountry, TTL_199607, TTL_199608, TTL_199609 -- TTL_199607 : Sum of Freight by ShipCountry, only OrderDate in 199607 -- TTL_199608 : Sum of Freight by ShipCountry, only OrderDate in 199608 -- TTL_199609 : Sum of Freight by ShipCountry, only OrderDate in 199609 -- Freight : When sum freight. use this logic. -- If EmployeeID is 1 or 3 then Freight * 0.9 else Frieht ------------------------------------------------------------------------ SELECT ShipCountry ,ISNULL(SUM(CASE WHEN CONVERT(NCHAR(6), OrderDate, 112) = 199607 AND EmployeeID IN (1, 3) THEN Freight * 0.9 WHEN CONVERT(NCHAR(6), OrderDate, 112) = 199607 THEN Freight END), '.00000') TTL_199607 ,ISNULL(SUM(CASE WHEN CONVERT(NCHAR(6), OrderDate, 112) = 199608 AND EmployeeID IN (1, 3) THEN Freight * 0.9 WHEN CONVERT(NCHAR(6), OrderDate, 112) = 199608 THEN Freight END), '.00000') TTL_199608 ,ISNULL(SUM(CASE WHEN CONVERT(NCHAR(6), OrderDate, 112) = 199609 AND EmployeeID IN (1, 3) THEN Freight * 0.9 WHEN CONVERT(NCHAR(6), OrderDate, 112) = 199609 THEN Freight END), '.00000') TTL_199609 FROM Orders GROUP BY ShipCountry ORDER BY ShipCountry ASC | cs |
-- SELECT절에 CASE를 사용하였다.
-- GROUP BY를 사용해서 ShipCountry를 묶어준다.
-- CASE문을 사용해서 OrderDate를 월별로 나눈 후, 집계함수 Sum을 사용해서 Freight의 합을 구해준다.
- 결과
3.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | --Use Orders table --Select Columns: -- Freight_1996, OrderCount_1996, Freight_1997, OrderCount_1997, -- Freight_1998, OrderCount_1998, Freight_TTL, OrderCount_TTL --Freight_1996 : Sum of freight in 1996 --OrderCount_1996 : Count of orders in 1996 --Freight_1997 : Sum of freight in 1997 --OrderCount_1997 : Count of orders in 1997 --Freight_1998 : Sum of freight in 1998 --OrderCount_1998 : Count of orders in 1998 --Freight_TTL : Sum of freight about all data --OrderCount_TTL : Count of orders about all data ------------------------------------------------------------------------ SELECT SUM(CASE WHEN DATEPART(YEAR, OrderDate) = 1996 THEN Freight ELSE 0 END) Freight_1996 ,COUNT(CASE WHEN DATEPART(YEAR, OrderDate) = 1996 THEN 1 ELSE NULL END) Freight_1996, ,SUM(CASE WHEN DATEPART(YEAR, OrderDate) = 1997 THEN Freight ELSE 0 END) Freight_1997 ,COUNT(CASE WHEN DATEPART(YEAR, OrderDate) = 1997 THEN 1 ELSE NULL END) Freight_1997 ,SUM(CASE WHEN DATEPART(YEAR, OrderDate) = 1998 THEN Freight ELSE 0 END) Freight_1998, ,COUNT(CASE WHEN DATEPART(YEAR, OrderDate) = 1998 THEN 1 ELSE NULL END) Freight_1998 ,SUM(Freight) Freight_TTL ,COUNT(*) OrderCount_TTL FROM Orders | cs |
-- WHERE문을 사용해서 OrderDate가 1996년 7월부터 1997년 이전의 데이터를 구한다.
-- GROUP BY에 CONVERT문을 사용해서 OrderDate를 월별로 묶은 후, CASE문을 사용해서 EmployeeID가 1, 2, 3인 경우 Special Emp로 나머지 경우 ETP Emp로 묶어준다.
-- SELECT문에서 Special Emp인 경우 Freight * 0.9를 하고, ETC Emp인 경우 Freight를 그냥 나타낸다.
-- 집계함수 SUM과 COUNT를 사용해서 합과 갯수를 구한다.
- 결과
4.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | --Use Orders table --Select OrderDate between '1996-07' and '1996-12' --Select columns -- OrderYM, EmpType, Freight, OrderCount --OrderYM : Convert OrderDate to YYYYMM format --EmpType : If EmployeeID in 1, 2, 3 then 'Special Emp' else 'ETC Emp' --SumFreight : Sum of freight by OrderYM, EmpType : Freight = if EmpType is Special Emp then Friehgt * 0.9 else Freight --OrderCount : Count of orders by OrderYM, EmpType ------------------------------------------------------------------------ SELECT CONVERT(NCHAR(6), OrderDate, 112) ,CASE WHEN EmployeeID IN(1, 2, 3) THEN 'Special Emp' ELSE 'ETC Emp' END EmpType ,SUM(Freight) SumFreight ,COUNT(*) OrderCount FROM Orders WHERE OrderDate >= '1996-07-01' AND OrderDate <'1997-01-01' GROUP BY CONVERT(NCHAR(6), OrderDate, 112) ,CASE WHEN EmployeeID IN(1, 2, 3) THEN 'Special Emp' ELSE 'ETC Emp' END ORDER BY CONVERT(NCHAR(6), OrderDate, 112) | cs |
-- WHERE문을 사용해서 OrderDate를 1996년 7월부터 1997년 이전의 데이터만 구한다.
-- GROUP BY를 사용해서 OrderDate를 월별로 묶어준다.
-- DISTINCT CASE문을 사용해서 ShipCountry에서 Customer가 중복값이 발생하는 경우 제외시킨다.
-- 집계함수 COUNT를 사용해서 해당 값들의 갯수를 구한다.
- 결과
SQL문 실습 - CASE문(1)
SQL문 실습 - CASE문(2)
'프로그래밍 > MS-SQL' 카테고리의 다른 글
MS-SQL 컬럼정보 확인하기 - SP_HELP (0) | 2016.06.13 |
---|---|
INNER JOIN이란? (0) | 2016.06.08 |
백업 세트에 기존 데이터베이스가 아닌 데이터베이스의 백업이 있습니다 (0) | 2016.05.17 |
데이터베이스가 사용중이어서 배타적으로 액세스할 수가 없습니다 (0) | 2016.05.16 |
SQL문 실습 - CASE문(2) (0) | 2016.05.07 |