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
운영게시판
최근게시물
MS-SQL Q&A 4298 게시물 읽기
No. 4298
SELECT문 질문입니다
작성자
초짜
작성일
2008-06-25 09:29
조회수
5,007

테이블 예제


A                      B           C

1010122          50D           3000

1010133          70D           6000

1010144          90D           9000

1010ABC        50D           4000

1010ABF        70D            8000

1010ABF         90D           12000

1020211          50D            6000

1020233          70D            8000

.........

이런 테이블이 있다고 가정합니다. A,B는 문자열이구요

SELECT 조건을 A칼럼중 앞 4자리와 일치하면서 B칼럼의 값들이 같은거를 찾아낸후 C 칼럼의 값의 합을 구하려고 합니다.

예를 들어 A칼럼에서 1010으로 시작되는 칼럼중 B칼럼이 50D인 칼럼을 찾아내면 1010122,1010ABC가 해당되고

해당열의 C칼럼의 합인 3000+4000=7000의 값을 도출하려고 하는데요

고수님들의 도움을 얻고 싶습니다

이 글에 대한 댓글이 총 4건 있습니다.
WITH TMP AS
(SELECT A = '1010122', B = '50D', C = 3000    UNION ALL
SELECT A = '1010133', B = '70D', C = 6000    UNION ALL
SELECT A = '1010144', B = '90D', C = 9000    UNION ALL
SELECT A = '1010ABC', B = '50D', C = 4000    UNION ALL
SELECT A = '1010ABF', B = '70D', C =  8000   UNION ALL
SELECT A = '1010ABF', B = '90D', C = 12000   UNION ALL
SELECT A = '1020211', B = '50D', C =  6000   UNION ALL
SELECT A = '1020233', B = '70D', C =  8000)
SELECT
 A.A, A.B, A.C
 , B.S_C
FROM TMP A
INNER JOIN (
 SELECT
  N_A = LEFT(A, 4) + B, S_C = SUM(C)
 FROM TMP
 GROUP BY LEFT(A, 4) + B
) B
ON LEFT(A.A, 4) = LEFT(B.N_A, 4)
AND A.B = RIGHT(B.N_A, 3)
.님이 2008-06-25 11:24에 작성한 댓글입니다. Edit
MSSQL2005 쓰시면..

WITH TMP AS
(SELECT A = '1010122', B = '50D', C = 3000    UNION ALL
SELECT A = '1010133', B = '70D', C = 6000    UNION ALL
SELECT A = '1010144', B = '90D', C = 9000    UNION ALL
SELECT A = '1010ABC', B = '50D', C = 4000    UNION ALL
SELECT A = '1010ABF', B = '70D', C =  8000   UNION ALL
SELECT A = '1010ABF', B = '90D', C = 12000   UNION ALL
SELECT A = '1020211', B = '50D', C =  6000   UNION ALL
SELECT A = '1020233', B = '70D', C =  8000)
SELECT A,
             B,
             SUM(C) OVER(PARTITION BY LEFT(A,4)+B) S_C
FROM TMP A;
소희옵하님이 2008-06-25 15:01에 작성한 댓글입니다.
이 댓글은 2008-06-25 15:10에 마지막으로 수정되었습니다. Edit

답변 감사합니다..sql 2000입니다.
그런데 저거는 예일뿐이고 실제 10만행 정도 있는 데이터에서 select할꺼라서 일일히 union all 쓰기 어렵네요 ㅠㅠ
 

초짜님이 2008-06-25 17:11에 작성한 댓글입니다. Edit

 

create table test(A char(7),B char(3),C int)

insert test

select '1010122','50D',3000 union all

select '1010133','70D',6000 union all

select '1010144','90D',9000 union all

select '1010ABC','50D',4000 union all

select '1010ABF','70D',8000 union all

select '1010ABF','90D',12000 union all

select '1020211','50D',6000 union all

select '1020233','70D',8000

 

----------------------------------------------------

select left(A,4),B,sum(C) from test group by left(A,4),B

 

/*

        B   

------- ---- -----------

1010    50D  7000

1020    50D  6000

1010    70D  14000

1020    70D  8000

1010    90D  21000

 

(5 적용됨)

*/

최석준(beatchoi)님이 2008-06-25 17:55에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
4303MSSQL->Oracle 10g로 Data 전환 방법론은(?) [1]
손님
2008-06-26
4936
4302@@ERROR 스레드 안전성에 대해 질문드립니다.
한승후
2008-06-26
4238
4301Linked Server 오라클의 프로시져 실행 방법? [1]
질문
2008-06-26
6489
4298SELECT문 질문입니다 [4]
초짜
2008-06-25
5007
4297데이타 내보내기중 오류관련.
질문
2008-06-23
4339
4295두개의 db에서 예상실행계획이 서로 다릅니다.
민재홍
2008-06-22
5048
4294통합검색 질문입니다. [1]
손님
2008-06-20
4126
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.020초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다