loading

프로그래밍/MS-SQL

SQL문 실습 - CASE문(3)

침착곰 2016. 5. 22. 17:13
반응형

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 (13
                        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 (13
                        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 (13
                        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(123
            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(123
            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)


여기까지 SQL문 실습의 CASE문에 대해서 알아봤습니다.
다음글에서는 SQL문에서 가장 어려운 부분 중 하나인 JOIN에 대해서 알아보겠습니다.

참고 : SQL Server 기본SQL문 교육


반응형
그리드형