데이터 타입이 문자형인데 숫자열 순으로 정렬하고 싶은데 모르겠어서 질문드립니다.
출력하고 싶은 결과는 2020-1 , 2020-2 순으로 월별 순서대로 정렬하고 싶습니다.
현재 쿼리는
select convert(nvarchar(10), year(ssh.so_dt)) + '-' + convert(nvarchar(10), month(ssh.so_dt)) as '년월별',
sum(ssd.so_qty) as 전체수량,
sum(ssd.net_amt_loc) as 총금액
from s_so_hdr as ssh
inner join s_so_dtl as ssd on ssh.so_no = ssd.so_no
where ssh.so_dt between '2020-01-01' and '2020-12-31'
group by convert(nvarchar(10), year(ssh.so_dt)) + '-' + convert(nvarchar(10), month(ssh.so_dt))
order by convert(nvarchar(10), year(ssh.so_dt)) + '-' + convert(nvarchar(10), month(ssh.so_dt))
이렇게 되어있습니다.
추가로 2020년도 1월~12월의 수량이랑 금액 합계를 맨 마지막 12월 행 뒤에 추가로 출력 가능할까요?
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 | -- 그룹 및 정렬 기준을 바꾸는 방안 -- SELECT CONVERT (NVARCHAR(10), YEAR (ssh.so_dt)) + '-' + CONVERT (NVARCHAR(10), MONTH (ssh.so_dt)) AS "년월별" , SUM (ssd.so_qty) AS 전체수량 , SUM (ssd.net_amt_loc) AS 총금액 FROM s_so_hdr ssh INNER JOIN s_so_dtl ssd ON ssh.so_no = ssd.so_no WHERE ssh.so_dt BETWEEN '2020-01-01' AND '2020-12-31' GROUP BY YEAR (ssh.so_dt), MONTH (ssh.so_dt) ORDER BY YEAR (ssh.so_dt), MONTH (ssh.so_dt) ; -- 년월별을 yyyy-mm 포멧으로 뽑는 방안 (2020-01, 2020-02) -- SELECT CONVERT (NVARCHAR(7), ssh.so_dt, 121) AS "년월별" , SUM (ssd.so_qty) AS 전체수량 , SUM (ssd.net_amt_loc) AS 총금액 FROM s_so_hdr ssh INNER JOIN s_so_dtl ssd ON ssh.so_no = ssd.so_no WHERE ssh.so_dt BETWEEN '2020-01-01' AND '2020-12-31' GROUP BY CONVERT (NVARCHAR(7), ssh.so_dt, 121) ORDER BY "년월별" ; -- 참고로. 알리아스에 홑따옴표는 표준이 아님. -- 변경전 : '년월별' -- 변경후 : "년월별" |
1 2 3 4 5 6 7 8 9 10 11 | -- ROLLUP -- SELECT ISNULL ( CONVERT (NVARCHAR(7), ssh.so_dt, 121), '합계' ) AS 년월별 , SUM (ssd.so_qty) AS 전체수량 , SUM (ssd.net_amt_loc) AS 총금액 FROM s_so_hdr ssh INNER JOIN s_so_dtl ssd ON ssh.so_no = ssd.so_no WHERE ssh.so_dt BETWEEN '2020-01-01' AND '2020-12-31' GROUP BY ROLLUP ( CONVERT (NVARCHAR(7), ssh.so_dt, 121)) ORDER BY 년월별 ; |
ssms 18쓰고 있습니다
select convert(nvarchar(10), year(ssh.so_dt)) + '-' +
convert(nvarchar(10), month(ssh.so_dt)) as 년월별,
sum(ssd.so_qty) as 전체수량,
sum(ssd.so_price) as 총금액
from s_so_hdr as ssh
inner join s_so_dtl as ssd on ssh.so_no = ssd.so_no
where ssh.so_dt between '2020-01-01' and '2020-12-31'
group by year(ssh.so_dt), month(ssh.so_dt)
with rollup
order by year(ssh.so_dt), month(ssh.so_dt)
이렇게 하니깐
NULL | 887038.000000 | 50500963247.77 |
NULL | 887038.000000 | 50500963247.77 |
2020-1 | ||
2020-2 | ||
2020-3 | ||
2020-4 | ||
2020-5 | ||
2020-6 | ||
2020-7 | ||
2020-8 | ||
2020-9 | ||
2020-10 | ||
2020-11 | ||
2020-12 |
이런식으로 나오네요 빈칸에 데이터는 다 들어가 있는데 생략했습니다
혹시 select절 서브쿼리 그룹by정렬 관련해서 하나만 더 질문해도 될까요?
1 2 3 4 5 6 7 | select isnull ( convert (nvarchar(7), ssh.so_dt, 121), '총합계' ) as 년월별, ssh.so_class as 산업분야, so_class_nm = ( select minor_nm from b_minor where major_cd = 'z' and minor_cd = ssh.so_class) from s_so_hdr as ssh inner join s_so_dtl as ssd on ssh.so_no = ssd.so_no where ssh.so_dt between '2020-01-01' and '2020-12-31' and ssh.so_class is not null group by convert (nvarchar(7), ssh.so_dt, 121), ssh.so_class |
이렇게 하니 ssh.so_class가 하나의 그룹으로 안묶여지네요..
select절의 서브쿼리가 아닌 다른 절의 서브쿼리를 해야할까요? 아니면 having같은거로 조건을 줘야 할까요?
여러가지 찾아보고 검색하다 해결 못해서 질문드려봅니다..
1 2 3 4 5 6 7 8 9 10 11 12 13 | SELECT CONVERT (NVARCHAR(7), ssh.so_dt, 121) AS 년월별 , ssh.so_class AS 산업분야 , bm.minor_nm AS so_class_nm FROM s_so_hdr ssh INNER JOIN s_so_dtl ssd ON ssh.so_no = ssd.so_no LEFT OUTER JOIN b_minor bm ON bm.major_cd = 'z' AND bm.minor_cd = ssh.so_class WHERE ssh.so_dt BETWEEN '2020-01-01' AND '2020-12-31' AND ssh.so_class IS NOT NULL GROUP BY CONVERT (NVARCHAR(7), ssh.so_dt, 121), ssh.so_class, bm.minor_nm ; |
1 2 3 4 5 6 7 | select isnull ( convert (nvarchar(7), ssh.so_dt, 121), '총합계' ) as 년월별, ssh.so_class as 산업분야, so_class_nm = ( select minor_nm from b_minor where major_cd = 'z' and minor_cd = ssh.so_class) from s_so_hdr as ssh inner join s_so_dtl as ssd on ssh.so_no = ssd.so_no where ssh.so_dt between '2020-01-01' and '2020-12-31' and ssh.so_class is not null group by convert (nvarchar(7), ssh.so_dt, 121), ssh.so_class |
현재 사용 쿼리입니다.
댓글에 이미지 첨부는 안되는걸로 보여서 본문에 사진 추가하겠습니다(본문 2번째 사진이 위 쿼리 실행결과입니다)
수량이랑 금액 합계 조회는 있습니다.
1 2 3 4 5 6 7 8 9 | select isnull ( convert (nvarchar(7), ssh.so_dt, 121), '총합계' ) as 년월별, ssh.so_class as 산업분야, so_class_nm = ( select minor_nm from b_minor where major_cd = 'zs009' and minor_cd = ssh.so_class) sum (ssd.so_qty) as 전체수량, sum (ssd.so_price) as 총금액 from s_so_hdr as ssh inner join s_so_dtl as ssd on ssh.so_no = ssd.so_no where ssh.so_dt between '2020-01-01' and '2020-12-31' and ssh.so_class is not null group by convert (nvarchar(7), ssh.so_dt, 121), ssh.so_class |
위 쿼리로 산업분야별로 그룹을 지어 나타내고 싶습니다
년월별 | 전체수량 | 총금액 | 산업분야 | so_class_num |
2020-01 | 1 | 645 | A | 화공기 |
2020-02 | 2 | 654 | B | 산업기계 |
2020-03 | 3 | 56 | C | 조선 |
2020-04 | 4 | 654 | D | 발전 |
2020-05 | 5 | 56 | E | 프랜지 |
2020-06 | 6 | 876 | F | 해외오파 |
2020-07 | 7 | 564 | G | 풍력 |
2020-08 | 8 | 645 | H | 밸브 |
2020-09 | 9 | 6564 | I | 등등 |
2020-10 | 10 | 4 | J | 등등 |
2020-11 | 11 | 465656 | K | 등등 |
2020-12 | 12 | 54 | L | 등등 |
총합계 | 78 | 654 | M | 등등 |
위 표 처럼 나타내고 싶습니다
숫자나 명칭은 임의로 넣었습니다