SQL 문제풀이 복습
SELECT p.name,
sum(ifnull(rest, 0)) AS "rest",
sum(ifnull(paid, 0)) AS "paid",
sum(ifnull(canceled, 0)) AS "canceled",
sum(ifnull(refunded, 0)) AS "refunded"
FROM Product p
LEFT JOIN Invoice i
ON p.product_id = i.product_id
GROUP BY p.product_id
ORDER BY 1 ASC;
문제 링크
문자열을 제어하는 SQL 함수 중
char_length를 묻는 문제.
char_length를 쓰면 띄어쓰기를 포함한
문자열의 길이를 계산해 준다.
SELECT tweet_id
FROM Tweets
WHERE char_length(content) > 15;
문제 링크
count와 count distinct
SELECT date_id,
make_name,
count(DISTINCT lead_id) AS "unique_leads",
count(DISTINCT partner_id) AS "unique_partners"
FROM DailySales
GROUP BY 1,
2;
SELECT count(id) AS "FISH_COUNT",
month(time) AS "MONTH"
FROM FISH_INFO
GROUP BY 2
ORDER BY 2;
문제 링크
ifnull과 avg, round를 한꺼번에 쓰는 문제.
어려울 건 없다.
avg가 쓰이긴 했지만
행별로 각각이 아닌 '하나의 값'을 구하는 문제이므로
group by도 쓸 필요 없음.
SELECT round(avg(ifnull(length, 10)), 2) AS "AVERAGE_LENGTH"
FROM FISH_INFO;
문제 링크
이렇게 쓰나 저렇게 쓰나 결과는 같다.
SELECT sum(CASE
WHEN length IS NULL THEN 1
end) AS "FISH_COUNT"
FROM FISH_INFO;
SELECT count(*) AS "FISH_COUNT"
FROM FISH_INFO
WHERE length IS NULL;
문제 링크
간단한 join과 집계함수 문제.
SELECT count(*) AS "FISH_COUNT",
fish_name
FROM FISH_INFO f
JOIN FISH_NAME_INFO fn
ON f.fish_type = fn.fish_type
GROUP BY 2
ORDER BY 1 DESC;
문제 링크
order by의 조건을 잘못 주면 오답이 뜨는 문제.
거리를 기준으로 내림차순하라고 되어 있었기 때문에
sum()으로 해야 하고, 그냥 order by 2 desc 하면
문자열까지 포함된 결과 기준으로 내림차순이기 때문에 오답인 듯.
SELECT route,
concat(round(sum(d_between_dist), 1), 'km') AS "TOTAL_DISTANCE",
concat(round(avg(d_between_dist), 2), 'km') AS "AVERAGE_DISTANCE"
FROM SUBWAY_DISTANCE
GROUP BY 1
ORDER BY sum(d_between_dist) DESC;