loading

프로그래밍/MS-SQL

SQL문 실습 - GROUP BY(4)

침착곰 2016. 4. 17. 16:44
반응형

저번 글에 이어서 

SQL문 실습 - GROUP BY (3)


SQL문 실습 - GROUP BY (2)


SQL문 실습 - GROUP BY (1)

GROUP BY에 대해서 예제문제를 풀어보면서 알아보겠습니다.



1. CONVERT를 이용해서 OrderDate를 년별로 캐스팅하고, OrderDate, CustomerID별로 GROUP BY를 했습니다. 집계함수를 통해서 갯수, Freight의 합계, 최대값, 최소값을 구했습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
--   Use Orders
--    Select OrderYY, CustomerID, OrderCount, TTL_Freight, MAX_Freight, MIN_Freight
--    OrderYY = OrderDate change to YYYY
--    OrderCount = Count of Orders by OrderYY, CustomerID
--    TTL_Freight = Sum of Freight by OrderYY, CustomerID
--    MAX_Freight = MAX of Freight in OrderYY, CustomerID
--    MIN_Freight = MIN of Freight in OrderYY, CustomerID
------------------------------------------------------------------------------
  SELECT CONVERT(NCHAR(4), OrderDate, 112) OrderYY
        ,CustomerID
        ,COUNT(*) OrderCount
        ,SUM(Freight) TTL_Freight
        ,MAX(Freight) MAX_Freight
        ,MIN(Freight) MIN_Freight
    FROM Orders
GROUP BY CONVERT(NCHAR(4), OrderDate, 112), CustomerID
ORDER BY CONVERT(NCHAR(4), OrderDate, 112)
cs

- 결과 데이터



2. OrderDate와 ShippedDate를 빼서 ShipDayCount를 구하고 GROUP BY와 집계함수를 통해서 그 갯수를 구했습니다.

1
2
3
4
5
6
7
8
9
10
11
--  Use Orders
--    Select ShipDayCount, OrderCount
--    ShipDayCount : Different between OrderDate and ShippedDate
--    OrderCount : Count of Orders by ShipDayCount
--    Sort by ShipDayCount(Descending)
------------------------------------------------------------------------------
  SELECT DATEDIFF(DAY, ORDERDATE, SHIPPEDDATE) ShipDayCount
        ,COUNT(*) ShipDayCount
    FROM Orders
GROUP BY DATEDIFF(DAY, ORDERDATE, SHIPPEDDATE)
ORDER BY DATEDIFF(DAY, ORDERDATE, SHIPPEDDATE) DESC
cs

- 결과 데이터



3. 이번에는 GROUP BY의 WHERE와 같은 역할을 하는 HAVING을 사용해서 GROUP BY에 조건을 걸어줍니다. CustomerID를 GROUP BY를 한 후 HAVING을 이용해서 그 갯수가 10이상인 데이터만 출력되게 조건을 걸었습니다.

1
2
3
4
5
6
7
8
9
10
11
12
--  Use Orders
--    Select CustomerID, OrderCount
--    And Select OrderCount bigger or equal than 10
--    OrderCount : Count of Orders by CustomerID
--    Use HAVING
------------------------------------------------------------------------------
  SELECT CustomerID
        ,COUNT(*) OrderCount
    FROM Orders
GROUP BY CustomerID
  HAVING COUNT(*>= 10
ORDER BY COUNT(*)
cs

- 결과 데이터



4. 위의 예제와 마찬가지로 HAVING을 사용해서 GROUP BY에 조건을 걸어줍니다.

1
2
3
4
5
6
7
8
9
10
11
12
--  Use Orders
--    Select EmployeeID, TTL_Freight
--    And Select TTL_Freight smaller or equal than 1000
--    TTL_Freight : Sum of Freight by EmployeeID
--    Use HAVING
------------------------------------------------------------------------------
  SELECT EmployeeID
        ,SUM(Freight) TTL_Freight
    FROM Orders
   WHERE OrderDate >=  '1996-01-01' AND OrderDate < '1997-01-01'
GROUP BY EmployeeID
  HAVING SUM(Freight) <= 1000
cs

- 결과 데이터



5. COUNT(DISTINCT City)를 이용해서 중복되는 city를 제외한 갯수를 구할 수 있다.

1
2
3
4
5
6
7
8
--  Use Customers
--    Select Country, CountryCityCount
--    CountryCityCount = Count of City(remove duplicate) by Country
------------------------------------------------------------------------------
  SELECT Country
        ,COUNT(DISTINCT city) CountryCityCount
    FROM Customers
GROUP BY Country
cs

- 결과 데이터


GROUP BY예제는 여기까지가 끝입니다.

GROUP BY는 SQL문에서 많이 사용되고 처음 사용할때는 약간 헷갈리는 부분이 많으므로 잘 알아두는게 좋습니다.

다음 글에서는 지금까지 사용했던 것을 모두 사용하는 LevelUp Test를 풀어보겠습니다.


다음 글 : SQL문 실습 - LevelUpTest

참고 : SQL Server 기본SQL문 교육

반응형
그리드형

'프로그래밍 > MS-SQL' 카테고리의 다른 글

SQL문 실습 - CASE문(1)  (0) 2016.05.07
SQL문 실습 - LevelUpTest  (0) 2016.04.17
SQL문 실습 - GROUP BY (3)  (0) 2016.04.17
DBMS의 데이터를 엑셀로 내보내기  (0) 2016.04.17
엑셀의 데이터를 DBMS로 가져오기  (1) 2016.04.17