두 컬럼에 대한 소계를 동시에 구하고 싶습니다. 0 11 1,414

by 춤과파티 [SQL Query] [2018.02.13 16:10:17]


원하는 해결 db전체 소스를 불러오면 더 복잡할 꺼 같으니 제가 원하는 바를 예로 말씀 드리겠습니다.

컬럼: 날짜, 스타일코드, 수량

하고자 하는 바는

날짜순으로 정렬된 뒤에 같은 스타일코드 별로 수량들의 소계와 총계를 구하고 싶은데

(다른 날짜에 같은 스타일 코드가 있더라도 별개의 소계가 출력되게끔....)

SELECT 날짜, 스타일코드, SUM(수량)

FROM DUAL

GROUP BY ROLLUP(날짜, 스타일)

ORDER BY 날짜, 스타일코드

이렇게 하면 날짜로만 짤려서 구분되기땜에 소계와 소계사이에 스타일코드 별로 소계는 나오질 않습니다,..ㅜ

1월1일 st01

소계1

1월1일 st02

소계2

1월2일 st11

소계3

1월3일 st21

소계4

1월3일 st01

소계5

총계

위와 같은 형태를 원하는데 제가 예를 든 코딩처럼하면 소계4는 없고 소계5 바로 위에 소계4가 들어가게 됩니다 ㅜ 

group by rollup(스타일코드) 이렇게만 줘버리면 날짜별 정렬도 먹히지 않고 날짜별 정렬을 하면 소계가 맨아래에 쭉나열되게 되버립니다.. 

두줄요약:저는 날짜별+스타일코드 동시에 소계가 나왔으면 하는데 방법이있을까요?

물론 날짜별 정렬은 된 상태에서요..

 

by 마농 [2018.02.13 16:22:42]

글쎄요? 주신 예시자료의 원하시는 결과가 명확하지 않네요?
표형태로 명확하게 제시해 주시면 좋을 듯 하네요.
일단 ROLLUP 대신 CUBE 사용해 보세요. 원하시는 것인지는 모르겠네요.


by 춤과파티 [2018.02.13 16:33:39]

댓글에 표를 통해 제 의도를 표현했는데 확인한번 해주시면 감사하겠습니다^^;


by 춤과파티 [2018.02.13 16:32:41]
날짜 스타일코드 SUM(수량)
1월1일 st01 15
1월1일 st01 5
소계1   20
1월1일 st02 10
소계2   10
1월2일 st11 20
1월2일 st11 20
소계3   40
1월3일 st01 7
1월3일 st01 8
소계4   15
1월3일 st21 10
소계5   10
총계    

요런식을 원합니다 스타일코드가 st01이라고 같은 데이터는 아니구요

스타일별 소계를 날짜별로 나눠준다고 설명해야할까.. 표로 만들었는데 의도를 아실 수 있으실까요..?


by 마농 [2018.02.13 16:39:19]
-- dt, cd 외에 레코드 식별자가 추가되어야 합니다.
WITH t AS
(
SELECT 1 pk, '20180101' dt, 'st01' cd, 15 v FROM dual
UNION ALL SELECT 2, '20180101', 'st01',  5 FROM dual
UNION ALL SELECT 3, '20180101', 'st02', 10 FROM dual
UNION ALL SELECT 4, '20180102', 'st11', 20 FROM dual
UNION ALL SELECT 5, '20180102', 'st11', 20 FROM dual
UNION ALL SELECT 6, '20180103', 'st01',  7 FROM dual
UNION ALL SELECT 7, '20180103', 'st01',  8 FROM dual
UNION ALL SELECT 8, '20180103', 'st21', 10 FROM dual
)
SELECT dt
     , cd
     , pk
     , SUM(v) v
  FROM t
 GROUP BY ROLLUP(dt, cd, pk)
;

 


by 춤과파티 [2018.02.13 16:52:09]

pk가 없거나 있어도 고유하지 않고 제각각이거나 중복된다면 이런식으로 출력하기 힘들까요??


by 마농 [2018.02.13 16:54:02]

출력하기 어려운 건 없습니다. 질문을 이해하기 어려울 뿐이죠.
대략의 그림을 그린다고 생각하지 마시고.
원하시는 것을 정확하게 표현해 주세요.
pk 가 없다면?
UK(Unique Key) 는 없는지 확인해 보시고.
그것마저 없다면?
ROWNUM 이나 ROWID 등 을 이용하세요.
 GROUP BY ROLLUP(dt, cd, ROWNUM)
 GROUP BY ROLLUP(dt, cd, ROWID)


by 춤과파티 [2018.02.13 17:01:52]

방금 알려주신 pk 컬럼을 추가하는 방법으로 1월3일 안에서 st01과 st21의 소계값을 구분하여 출력하는데 아이디어를 얻게 되어서 제가 해결하려는 문제에 도입해볼 방법을 찾은것 같습니다.

제가 다루는 테이블엔 pk가 없기때문에 제 임의대로 날짜와 스타일코드를 문자열 연결자 || 를 써서 고유한 값을 가질 수 있는 컬럼을 만든 서브쿼리를 참조하여 해결을 하면 될 것 같습니다. 해보고 해결 된다면 또 한번 감사하다고 댓글을 남기도록 하겠습니다. 감사합니다!


by 마농 [2018.02.13 17:16:25]

음...해결방법 이라는게 너무 복잡해 보이네요.
컬럼을 붙이고 서브쿼리까지 사용할 정도는 아닌 것 같은데요.
좀 더 쉬운 방법을 찾아보세요.


by 춤과파티 [2018.02.13 18:05:14]

평범한 테이블이 아니구 그리드용 테이블이라 pk가 없었었구여.. rownum은 맨나중 select 문에서 명시적으로 행번호를 매겨주기위해 사용되기땜에 pk컬럼 대용으로 쓰긴 어려웠습니다.. rowid로 사용하려면 전 서브쿼리에서 등록을해서 써야되는데 그렇게되면 제가원하는 정렬을 구현할수없었구요.. ㅜ 아무튼 이래저래 제가 처음부터 만든 쿼리문은 아니였고 만들어진 형식 내에서 최소한 뜯어고치면서 구현을 해야했기땜에 제 기준에 맞는 컬럼을 문자형태로 두개 합쳐서 pk용으로 하나 만들어서 구현해보니 제가 원하는 결과가 출력됬습니다! 다 마농님 덕분이에요 감사합니다 좋은 저녁시간 되세요^.^


by 마농 [2018.02.13 18:13:07]

실제 테이블에 PK 를 설정하는게 아니고
단순히 위와 같은 출력을 위한 것이라면? ROWNUM 으로 충분합니다.


by 춤과파티 [2018.02.14 09:35:49]

넵 무슨 말씀인지 잘 알겠습니다!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입