SQL 질문과 답변 게시판
Microsoft SQL Server와 관련된 질문과 답변을 올리는 게시판입니다. 궁금하신 내용을 이곳에서 문의하시면 SQLER 분들의 답변을 받으실 수 있습니다. 문의를 하실때에는 최근 작업하신 특이 사항이나, 장애 발생 전 상황을 상세히 올려 주시면 답글을 적어주시는 SQLER분들의 답변이 더 정확할 수 있으니 도움 되시길 바랍니다. 쿼리 문의일 경우, 실제 문제가 재현되는 테이블생성, 샘플데이터 생성 쿼리를 함께 올려 주시면 더 빠르고 정확한 쿼리 문의 응답이 가능합니다.
글 수 5,175
제가 SQL을 시작한지 얼마 안되서 쿼리를 작성하는데 많은 어려움을 느끼고 있습니다.
여기저기 찾아보면서 하고있지만 많이 부족해서 도움을 받고자 글을 올립니다.
test 테이블에 jumin1, sex 컬럼이 있습니다.
jumin1 에는 821201 과 같은 형식의 데이터가 입력되어 있고 sex 에는 M, F 두가지의 값이 입력되어 있습니다.
연령 = 2010 - ( '19' + left(jumin1,2))
남자 = M
여자 = F
|
연령 |
남자 |
여자 |
합계 |
|
22 |
1 |
|
1 |
|
23 |
2 |
2 |
4 |
|
24 |
3 |
2 |
5 |
위와 같은 테이블의 형식으로 연령에 따른 남자, 여자 각각의 카운트 값을 구하고 싶습니다.
도움 부탁드리겠습니다.
2010.08.03 17:37:18 (*.97.37.231)
with t as (
select 1 idx, '771201' jumin1, 'M' sex from dual union all
select 2 idx, '771201' jumin1, 'M' sex from dual union all
select 3 idx, '821201' jumin1, 'M' sex from dual union all
select 4 idx, '921201' jumin1, 'M' sex from dual union all
select 5 idx, '421201' jumin1, 'M' sex from dual union all
select 6 idx, '421201' jumin1, 'F' sex from dual union all
select 7 idx, '521201' jumin1, 'F' sex from dual union all
select 8 idx, '521201' jumin1, 'F' sex from dual union all
select 9 idx, '721201' jumin1, 'F' sex from dual
)
select 2010 - ( '19'||substr(jumin1,1,2)) age
, sum(case when sex = 'M' then 1 else 0 end) mcnt
, sum(case when sex = 'F' then 1 else 0 end) fcnt
, sum(1) tcnt
from t
group by 2010 - ( '19'||substr(jumin1,1,2))
order by 1
select 1 idx, '771201' jumin1, 'M' sex from dual union all
select 2 idx, '771201' jumin1, 'M' sex from dual union all
select 3 idx, '821201' jumin1, 'M' sex from dual union all
select 4 idx, '921201' jumin1, 'M' sex from dual union all
select 5 idx, '421201' jumin1, 'M' sex from dual union all
select 6 idx, '421201' jumin1, 'F' sex from dual union all
select 7 idx, '521201' jumin1, 'F' sex from dual union all
select 8 idx, '521201' jumin1, 'F' sex from dual union all
select 9 idx, '721201' jumin1, 'F' sex from dual
)
select 2010 - ( '19'||substr(jumin1,1,2)) age
, sum(case when sex = 'M' then 1 else 0 end) mcnt
, sum(case when sex = 'F' then 1 else 0 end) fcnt
, sum(1) tcnt
from t
group by 2010 - ( '19'||substr(jumin1,1,2))
order by 1


CREATE TABLE #test
(
idx INT
, jumin1 CHAR(6)
, sex CHAR(1)
)
GO
INSERT #test VALUES(1, '771201', 'M')
INSERT #test VALUES(2, '771201', 'M')
INSERT #test VALUES(3, '821201', 'M')
INSERT #test VALUES(4, '921201', 'M')
INSERT #test VALUES(5, '421201', 'M')
INSERT #test VALUES(6, '421201', 'F')
INSERT #test VALUES(7, '521201', 'F')
INSERT #test VALUES(8, '521201', 'F')
INSERT #test VALUES(9, '721201', 'F')
DECLARE @year AS SMALLINT
SET @year = YEAR(GETDATE()) - 1899
SELECT @year - born_year AS 연령
, CASE WHEN sex = 'M' THEN count_num ELSE 0 END AS 남자
, CASE WHEN sex = 'F' THEN count_num ELSE 0 END AS 여자
FROM (
SELECT LEFT(jumin1, 2) AS born_year, sex, COUNT(*) AS count_num
FROM #test
GROUP BY LEFT(jumin1, 2), sex
) SUB
ORDER BY @year - born_year
SqlServer가 2000이시니 위와 같이 하시면 될 것 같습니다.
이건 비교적 간단해서 제가 작성했습니다만 다음에는 문의 올리실 때 데이터를 스크립트로
만들어서 문의하시면 더욱 신속 정확한 답을 얻으실 수 있을꺼에요.