Group By

Group By로 테이블에서 가져온 데이터를 몇 개의 그룹으로 분리할 수 있다.

학생들의 성적의 평균을 과제 유형에 따라 나누어 보고싶다고 하자.

GradeType을 기준으로 그룹을 묶어주어야 하기때문에 GROUP BY GradeType으로 그룹핑을 해줄 수 있다.

다만 여기서 문제점은 NULL값은 평균값을 구할 때 무시된다는 점이다.

만약 여기서 NULL값을 0점처리 하고싶다면 AVG(Group)을 AVG(ISNULL(Grade, 0))로 계산해야한다.

 

여기서 한단계 더 나아가보자.

Group By로 각 학생들의 퀴즈와 시험점수 평균을 내어보자.

이때는 Group By에 복수의 열을 넣어주면 된다.

학생 - 시험 유형 - 평균 점수 형태로 바꾸어주었다.

여기서 시험 평균 점수가 70점 이상인 학생의 데이터만 보고싶다고 하자.

이 경우에는 Having을 이용할 수 있다.

HAVING

Having과 Where은 선택 기준을 적용할때 이용된다.

다만 Where는 각 행에 적용되는 기준이라면 Having은 그룹 차원으로 선택 논리를 적용시킨다.
(where를 쓸때는 집계함수같은걸 못쓴다 avg, count, sum...)

Having 키워드는 반드시 group by 뒤와 order by 앞에 와야한다.

 

이번에는 7학년이면 70점 이상, 8학년이면 75점 이상인 학생 목록을 뽑아볼것이다.

위처럼 case문을 이용해 다른 조건을 부여할 수 있다.

GROUP BY와 CASE

Group By에서 case 표현이 사용될 때, 그와 똑같은 표현이 select의 문장에서도 사용되어야한다.

이와 같이 Select와 Group By에 같은 case문장이 사용되어야한다.

 

'DB > 관계형 DB' 카테고리의 다른 글

분할(Partition)  (0) 2021.04.23
랭킹 함수(Row_Number, Rank, Dense_Rank, NTile)  (0) 2021.04.22
데이터 요약 - 집계 함수  (0) 2021.04.15
데이터 요약 - 중복제거(Distinct)  (0) 2021.04.15
WHERE절의 조건부 논리(case)  (0) 2021.04.15

집계함수중 자주 사용되는 함수는 SUM, COUNT, AVG, MIN, MAX 등이 있다.

SUM

Sum 함수는 해당하는 값들을 모두 더해서 출력해준다.

where FeeType = 'Gym'으로 FeeType이 Gym인 데이터에 대한 합을 출력했다.

AVG MIN MAX

AVG MIN MAX는 각각 평균, 최소, 최대값을 계산한다.

해당 함수는 데이터 타입이 numeric일경우에만 사용 가능하고, varchar와 같이 문자일경우에는 사용 불가하다.

 

COUNT

count는 선택된 행의 개수를 반환한다.

count(선택한 열)의 형태를 가진다.

위 테이블은 where의 조건을 만족하는 행의 개수를 반환하는 예시이다.

위 예시는 distinct를 이용해 중복되는 경우는 제외하고 카운트를 반환하는 예시이다.

중복을 제거하면 Gym, Lunch, Trip 세가지이므로 3을 반환한다.

Distinct는 출력에서 중복된 값을 제거한다.

SongTitles 테이블에서 Artist열만 가져온다고 했을 때, 중복되는 데이터가 존재한다.

이 때 distinct로 중복 데이터를 제거해줄 수 있다.

'DB > 관계형 DB' 카테고리의 다른 글

데이터 그룹화(Group By)  (0) 2021.04.22
데이터 요약 - 집계 함수  (0) 2021.04.15
WHERE절의 조건부 논리(case)  (0) 2021.04.15
Order By 조건부 논리(case)  (0) 2021.04.15
검색형 CASE  (0) 2021.04.15
CustomerId Sex Age Income
1 M 55 80000
2 F 25 65000
3 M 35 40000
4 F 42 90000
5 F 27 25000

해당 테이블을 복합적인 조건을 만족하는 항목만 선택해서 출력할것이다.

성별이 남성인 경우, 50세 이상이고 수입이 75000이상인 경우만, 성별이 여성인 경우, 35세 이상이고 수입이 60000이상인 경우만 출력한다. 성별과 나이 조건을 충족하지 못한 경우에는 수입이 50000이상인 경우만 출력한다.

SELECT *
  FROM CustomerList
  WHERE Income >
  CASE
    WHEN Sex = 'M' AND Age >= 50 THEN 75000
    WHEN Sex = 'F' AND Age >= 35 THEN 60000
    ELSE 50000
  END

WHERE Income >의 우항에 들어갈 수치를 case를 통해 결정한다. 그리고 각 항목이 이를 충족할 때 출력한다.

CustomerID Sex Age Income
1 M 55 80000
2 F 25 65000
4 F 42 90000

 

'DB > 관계형 DB' 카테고리의 다른 글

데이터 요약 - 집계 함수  (0) 2021.04.15
데이터 요약 - 중복제거(Distinct)  (0) 2021.04.15
Order By 조건부 논리(case)  (0) 2021.04.15
검색형 CASE  (0) 2021.04.15
CASE  (0) 2021.04.15

Order by로 정렬할 때 case문을 활용해 정렬할 수 있다.

Country로 1차적으로 오름차순으로 정렬 후, case로 US, CA인지에 따라 2차적으로 정렬을 한번 더 해준다.

 

'DB > 관계형 DB' 카테고리의 다른 글

데이터 요약 - 중복제거(Distinct)  (0) 2021.04.15
WHERE절의 조건부 논리(case)  (0) 2021.04.15
검색형 CASE  (0) 2021.04.15
CASE  (0) 2021.04.15
패턴 매칭(Like)/ 와일드카드  (0) 2021.04.14

검색형 case의 일반적인 형태는 다음과 같다.

case
when [condition A] then resultA
when [condition B] then resultB
...
else [defaultResult]
end

when 다음으로 참 거짓이 되는 조건을 지정하고, 해당 조건이 참이면 then을 실행한다.

GroceryID Fruit Vegetable Spice Beverage Description
1 X       Apple
2 X       Orange
3     X   Mustard
4   X     Carrot
5       X Water

위와 같은 테이블이 있을 때, 검색형 case로 카테고리를 정리해볼것이다.

select
  case
    when Fruit = 'X' then 'Fruit'
    when Vegetable = 'X' then 'Vegetable'
    else 'Other'
  end as 'Category',

  [Description]

from Groceries

해당 코드는 다음과 같이 출력된다.

Category Description
Fruit Apple
Fruit Orange
Other Mustard
Vegetable Carrot
Other Water

Fruit 열이 X값을 가지고 있을 경우, category에 Fruit을, Vegetable 열이 X값을 가질경우 Vegetable을, 그 외에는 Other를 출력하게 했다.

 

'DB > 관계형 DB' 카테고리의 다른 글

WHERE절의 조건부 논리(case)  (0) 2021.04.15
Order By 조건부 논리(case)  (0) 2021.04.15
CASE  (0) 2021.04.15
패턴 매칭(Like)/ 와일드카드  (0) 2021.04.14
선택 기준 (WHERE, TOP)  (0) 2021.04.08

+ Recent posts