database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 37917 게시물 읽기
No. 37917
SQL 계산(테이블형태 변환) 질문 드려요...
작성자
laon
작성일
2010-08-31 14:43
조회수
2,936

 

SQL짜다가 막혀서 질문드립니다.

날짜 구분코드 금액
2010-05-31 10 100
2010-05-15 10 30
2010-06-05 20 10
2010-06-12 20 200
2010-07-09 10 100
2010-08-10 20 300

위에것 처럼 되어있는 테이블에서

밑에와 같은 결과가 나오게 하려면 어떻게 해야되나요?

 

10 20 총계
  건수 금액 건수 금액 건수 금액
5월 2 130 0 0 2 130
6월 0 0 2 210 2 210
7월 1 100 0 0 1 100

너무 막혀서 질문드립니다.

답변부탁드려요...

이 글에 대한 댓글이 총 4건 있습니다.

WITH TAB AS (
SELECT '2010-05-31' DT, '10' CODE,  100 AMT FROM DUAL UNION ALL
SELECT '2010-05-15' DT, '10' CODE,  30  AMT FROM DUAL UNION ALL
SELECT '2010-06-05' DT, '20' CODE,  10  AMT FROM DUAL UNION ALL
SELECT '2010-06-12' DT, '20' CODE,  200 AMT FROM DUAL UNION ALL
SELECT '2010-07-09' DT, '10' CODE,  100 AMT FROM DUAL UNION ALL
SELECT '2010-08-10' DT, '20' CODE,  300 AMT FROM DUAL
)

SELECT TO_NUMBER(SUBSTR(REPLACE(DT, '-', ''), 5, 2)) || '월'            MM
     , COALESCE(COUNT(CASE WHEN CODE = '10' THEN 1   ELSE NULL END), 0) CNT_10
     , COALESCE(SUM(CASE WHEN CODE   = '10' THEN AMT ELSE NULL END), 0) AMT_10
     , COALESCE(COUNT(CASE WHEN CODE = '20' THEN 1   ELSE NULL END), 0) CNT_20
     , COALESCE(SUM(CASE WHEN CODE   = '20' THEN AMT ELSE NULL END), 0) AMT_20
     , COUNT(*) ALL_CNT
     , SUM(AMT) ALL_AMT
  FROM TAB
 GROUP BY SUBSTR(REPLACE(DT, '-', ''), 5, 2)
 ORDER BY SUBSTR(REPLACE(DT, '-', ''), 5, 2)

지나가다님이 2010-08-31 15:23에 작성한 댓글입니다. Edit

지나가다님 답변 감사드립니다~

근데 제가 초보라 with tab as 부분이 이해가 잘안되는데요

select '2010-05-31' 에서 날짜 부분은 실제 입력된 날짜로 써야 하나요? 아니면 칼럼명으로 써야 되나요?

with tab as 부분 설명 부탁드려도 될까요?

 

laon님이 2010-08-31 15:34에 작성한 댓글입니다. Edit

with t as (
select '20100531' dt,  '10' dv,  100 amt from dual union all
select '20100515' dt,  '10' dv,  30  amt from dual union all
select '20100605' dt,  '20' dv,  10  amt from dual union all
select '20100612' dt,  '20' dv,  200 amt from dual union all
select '20100709' dt,  '10' dv,  100 amt from dual union all
select '20100810' dt,  '20' dv,  300 amt from dual
)
select substr(dt,1,6) mon
     , count(decode(dv, '10', dt    )) qty_10
     , sum  (decode(dv, '10', amt, 0)) amt_10
     , count(decode(dv, '20', dt    )) qty_20
     , sum  (decode(dv, '20', amt, 0)) amt_20
     , count(dt )                      qty_al
     , sum  (amt)                      amt_al
  from t
 group by substr(dt,1,6)
 order by 1

 

 

with as 는 사용하실 필요 없구요,.. .해당 테이블 사용하시면 됩니다..

知音(sunnylee72)님이 2010-08-31 15:34에 작성한 댓글입니다.
이 댓글은 2010-08-31 15:35에 마지막으로 수정되었습니다.

아 부끄럽습니다...공부 많이 해야겠네요...

지나가다님, 知音(sunnylee72) 님 모두 답변 감사합니다.

 

LAON님이 2010-08-31 15:52에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
37922sql_trace = false 인데 trace 파일이 생겨요.
박철
2010-09-01
2674
37920다시 쿼리 질문 드립니다. [3]
고민중
2010-09-01
3081
37919바인딩 변수를 왜 사용하나요? [3]
정현도
2010-08-31
4941
37917SQL 계산(테이블형태 변환) 질문 드려요... [4]
laon
2010-08-31
2936
37915결재라인 쿼리 질문입니다. [1]
질럿
2010-08-31
3051
37914소계, 합계 쿼리좀 꼭좀 부탁드립니다ㅠㅠ [2]
이석영
2010-08-31
4591
37913쿼리 질문하나 드립니다. [3]
고민중
2010-08-31
2834
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.023초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다