일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- ABTest
- 표본
- Python
- 리텐션
- 코테
- engagement
- 데이터가공
- data
- DAU
- warehouser
- pvalue
- 통계
- 특정컬럼
- dataanalysis
- sql로데이터
- WAU
- row추가
- 데이터분석
- 이전행
- onehot
- 그룹
- 데이터
- SQL
- categorical
- 전처리
- 그로스마케터
- GTM
- dataanalyst
- INSERTINTO
- 데이터분석가
- Today
- Total
Meiren
[5일 벼락치기] 1day, SQL Level 1~ 3.zip 본문
잘 안풀린거 위주
2. 재구매가 일어난 상품과 회원 리스트 구하기
- group by -> having count...
SELECT USER_ID, PRODUCT_ID
FROM ONLINE_SALE
GROUP BY USER_ID, PRODUCT_ID
HAVING COUNT(SALES_AMOUNT) > 1
ORDER BY USER_ID, PRODUCT_ID DESC
3. Union
- join으로 풀면 틀림 ㅎ
UNION ALL : 모든 컬럼값이 같은 ROW도 결과로 보여준다. 중복제거 하지 않는다.
UNION (DISTINCT) : 쿼리의 결과를 합친다. 중복된 ROW는 제거 - 내 쿼리
SELECT O.SALES_DATE AS SALES_DATE, O.PRODUCT_ID, IFNULL(O.USER_ID, NULL) AS USER_ID, O.SALES_AMOUNT FROM ONLINE_SALE O JOIN OFFLINE_SALE S ON O.PRODUCT_ID = S.PRODUCT_ID WHERE O.SALES_DATE LIKE '%-03-%' AND S.SALES_DATE LIKE '%-03-%' ORDER BY SALES_DATE, PRODUCT_ID, USER_ID ;
- 통과 쿼리
SELECT DATE_FORMAT(Z.SALES_DATE, '%Y-%m-%d') SALES_DATE, Z.PRODUCT_ID, Z.USER_ID, Z.SALES_AMOUNT
FROM (
SELECT SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT FROM ONLINE_SALE
UNION ALL
SELECT SALES_DATE, PRODUCT_ID, NULL, SALES_AMOUNT FROM OFFLINE_SALE
) Z
WHERE SALES_DATE LIKE '2022-03%'
ORDER BY SALES_DATE, PRODUCT_ID, USER_ID
4. between 100 and 200
- 100이상 200이하로 둘다 포함됨
- where 100 <= A <= 200 은 안됨...
SELECT COUNT(*) AS USERS
FROM USER_INFO
where YEAR(JOINED) = 2021
AND AGE between 20 and 29
5. MIN, MAX
- 가장 고가의 상품
SELECT MAX(PRICE) AS MAX_PRICE
FROM PRODUCT
LIMIT 1
- 가장 최근(마지막)에 들어온 동물
ver1) SELECT DATETIME 시간 FROM ANIMAL_INS ORDER BY DATETIME DESC LIMIT 1
ver2) SELECT MAX(DATETIME) AS 시간 FROM ANIMAL_INS
6. Count vs sum
- count vs sum
- 아니 사람들이... 이게 다르다 나도 몰랐다 이런 글은 많은데 그래서 어떻게 해서 다른건지를...... 왜... ... 왜... 그래서 나도 몰라 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
- count : 조회되는 row다 += 1,
- COUNT(*) : NULL 포함
- COUNT({colname}) : null 미포함!!
- 단 null값은 제외, 그러면 row의 5개 값 중 1개가 Null이면 제외시키는건지?
- 어쨌든, count(특정 컬럼명)에서 null이어도 카운트하려면 함수 써야함
- sum : 주어진 조건을 모두 만족할 때 카운트
- count(distinct {colname})
- 중복값 제거한 유일한 값만 카운트
- null값은 디폴트로 제외되기 때문에 조건절이 필요 없다
SELECT count(DISTINCT NAME) as count
from ANIMAL_INS
# where NAME is not null
7. @변수명 := 대입할 값
- @ : 변수 선언
- :=, = : 대입연산자, 비교연산자
SET @hour_count := -1;
# 시간이 0부터여서 := -1대입한다
SELECT @hour_count:=@hour_count+1 as hour,
(
select count(DATETIME)
from ANIMAL_OUTS
where @hour_count = HOUR(DATETIME)
) as count
FROM ANIMAL_OUTS
where @hour_count < 23
8. CASE WHEN
- WRONG SQL
SET @STANDARD:= -10000;
SELECT @STANDARD:=@STANDARD+10000 AS PRICE_GROUP
, (SELECT COUNT(PRODUCT_ID)
FROM PRODUCT
WHERE PRICE >= @STANDARD AND PRICE < @STANDARD+10000
) AS PRODUCTS
FROM PRODUCT
GROUP BY PRICE_GROUP
- 반올림/내림
- floor : 무조건 내림
- round (9.89, 1) = 9.9
- round(11.72, -1) = 10 <-- 음수면, 소수점 앞자리에서 반올림
- ceiling(11.3) = 12 <-- 올림
- / -> 몫만 가져가려면 -> floor({colname}/숫자) : 몫!!
- % : 나머지
SELECT floor(PRICE/10000) *10000 AS PRICE_GROUP, COUNT(PRICE) AS PRODUCTS
FROM PRODUCT
GROUP BY PRICE_GROUP
ORDER BY PRICE_GROUP
9. null값 처리
- ifnull
- if ({colname} is null, {null인 경우 값}, {null이 아닌 경우 값}) as {colname}
SELECT WAREHOUSE_ID, WAREHOUSE_NAME, ADDRESS, IFNULL(FREEZER_YN, 'N')
FROM FOOD_WAREHOUSE
WHERE WAREHOUSE_NAME LIKE '%_경기%'
ORDER BY WAREHOUSE_ID
10. SUM, 조건절 대신
- sum(age is null)
- age = null 인 것이 True == 1이 됨, 따라서 null인 경우가 1로 카운트됨
SELECT SUM(AGE IS NULL) AS USERS
FROM USER_INFO;
- count(*)하면 null도 포함해서 문제가 됨,
- count(user_id)라고 특정 컬럼명을 선택하면 자동으로 null은 제외하고 카운트 됨
SELECT COUNT(USER_ID) AS USERS
FROM USER_INFO
WHERE AGE IS NULL;
'SQL' 카테고리의 다른 글
[SQL 문법] INSERT INTO 데이터 삽입 (0) | 2023.01.15 |
---|---|
[SQL 문법]JOIN() 총정리! 쉽게 한번에 끝내자. (INNER JOIN, OUTER JOIN, LEFT JOIN, RIGHT JOIN, CROSS JOIN, SELF JOIN) (1) | 2023.01.15 |
[SQL 문법] LAG()과 LEAD()의 차이 및 활용 방법(예제 코드) (0) | 2023.01.15 |
[SQL 문법] PARTITION BY(파티션 분할)과 ROW_NUMBER() OVER() 정리 (1) | 2023.01.15 |
[SQL 문법]WITH 문법 및 가상테이블 만들기/mysql (0) | 2023.01.14 |