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 6832 게시물 읽기
No. 6832
자식 로우 찾기 2
작성자
우세연(w2share)
작성일
2014-07-13 16:04ⓒ
2014-07-13 16:05ⓜ
조회수
6,948

 tbl

id acct tType amount D
1 1111 c 200 6/1/2014
2 2121   100 6/1/2014
3 3131   100 6/1/2014
4 2222 c 250 6/2/2014
5 3131   100 6/2/2014
6 2121   100 6/2/2014
7 4141   50 6/2/2014
8 1111 c 350 6/3/2014
9 5151   150 6/3/2014
10 6161   200 6/3/2014
11 3333 c 400 6/3/2014
12 2121   200 6/3/2014
13 3131   200 6/3/2014
14 1111 c 500 6/5/2014
15 4141   100 6/5/2014
16 5151   200 6/5/2014
17 6161   200 6/5/2014
18 2222 c 400 6/5/2014
19 4141   400 6/5/2014

C 에 'c' 가 있는 로우들은 입금표고 그 다음 c 가 없는 로우들은 입금에 대한 하위목록입니다.

전에 우욱님께서 답변해 주신 대로 해봤더니 각각의 c 로우에 대한 하위목록이 잘 나오네요.

예를들어 id 14번에 대한 하위목록을 뽑을때

WITH tbl (id, ACCT, tType, AMT, D)

 AS

(

 SELECT         1, 1111, 'c', 200, '6/1/2014'

 UNION ALL SELECT 2, 2121, ' ', 100, '6/1/2014'

 UNION ALL SELECT 3, 3131, ' ', 100, '6/1/2014'

 UNION ALL SELECT 4, 2222, 'c', 250, '6/2/2014'

 UNION ALL SELECT 5, 3131, ' ', 100, '6/2/2014'

 UNION ALL SELECT 6, 2121, ' ', 100, '6/2/2014'

 UNION ALL SELECT 7, 4141, ' ', 50, '6/2/2014'

 UNION ALL SELECT 8, 1111, 'c', 350, '6/3/2014'

 UNION ALL SELECT 9, 5151, ' ', 150, '6/3/2014'

 UNION ALL SELECT 10, 6161, ' ', 200, '6/3/2014'

 UNION ALL SELECT 11, 3333, 'c', 400, '6/3/2014'

 UNION ALL SELECT 12, 2121, ' ', 200, '6/3/2014'

 UNION ALL SELECT 13, 3131, ' ', 200, '6/3/2014'

 UNION ALL SELECT 14, 1111, 'c', 500, '6/5/2014'

 UNION ALL SELECT 15, 4141, ' ', 100, '6/5/2014'

 UNION ALL SELECT 16, 5151, ' ', 200, '6/5/2014'

 UNION ALL SELECT 17, 6161, ' ', 200, '6/5/2014'

 UNION ALL SELECT 18, 2222, 'c', 400, '6/5/2014'

 UNION ALL SELECT 19, 4141, ' ', 400, '6/5/2014'

)

, tid( id )

AS

(

SELECT TOP (1) id FROM tbl WHERE D = '6/5/2014' and ACCT = 1111 and AMT = 500

)

SELECT * from tbl

INNER JOIN tid on tbl.id > tid.id

INNER JOIN (SELECT ISNULL ( MIN ( id ),  (SELECT MAX ( id ) + 1 from tbl ) ) AS minid FROM tbl

WHERE id > ( SELECT id from tid ) AND tType = 'c' ) as t2 on tbl.id  < t2.minid

 

... 하면 6/5/2014 의 ACCT  1111 에  500원 입금을 한것에 대한 하위 목록 3개 ( id 15, 16, 17) 가 잘 나옵니다.

---

이번 질문은... acct  = 1111 이고 tType = 'C' 인것의 모든 하위 목록들 (빨간 글씨로 된부분) 을 어떻게 쿼리하면 모두 뽑아 낼수 있을까요?

 

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

WITH tbl (id, ACCT, tType, AMT, D)

AS
(
           SELECT 1, 1111, 'c', 200, '6/1/2014'
 UNION ALL SELECT 2, 2121, ' ', 100, '6/1/2014'
 UNION ALL SELECT 3, 3131, ' ', 100, '6/1/2014'
 UNION ALL SELECT 4, 2222, 'c', 250, '6/2/2014'
 UNION ALL SELECT 5, 3131, ' ', 100, '6/2/2014'
 UNION ALL SELECT 6, 2121, ' ', 100, '6/2/2014'
 UNION ALL SELECT 7, 4141, ' ', 50, '6/2/2014'
 UNION ALL SELECT 8, 1111, 'c', 350, '6/3/2014'
 UNION ALL SELECT 9, 5151, ' ', 150, '6/3/2014'
 UNION ALL SELECT 10, 6161, ' ', 200, '6/3/2014'
 UNION ALL SELECT 11, 3333, 'c', 400, '6/3/2014'
 UNION ALL SELECT 12, 2121, ' ', 200, '6/3/2014'
 UNION ALL SELECT 13, 3131, ' ', 200, '6/3/2014'
 UNION ALL SELECT 14, 1111, 'c', 500, '6/5/2014'
 UNION ALL SELECT 15, 4141, ' ', 100, '6/5/2014'
 UNION ALL SELECT 16, 5151, ' ', 200, '6/5/2014'
 UNION ALL SELECT 17, 6161, ' ', 200, '6/5/2014'
 UNION ALL SELECT 18, 2222, 'c', 400, '6/5/2014'
 UNION ALL SELECT 19, 4141, ' ', 400, '6/5/2014'
)
, inTbl
AS
(
SELECT * , CASE WHEN 'C' = tType THEN id ELSE ( SELECT MAX( id ) FROM tbl AS aa WHERE tType = 'C' AND aa.id < tbl.id ) END AS orgId
FROM tbl 
)
SELECT cc.*
FROM inTbl AS bb
INNER JOIN inTbl AS cc
ON bb.id = cc.orgId AND cc.tType = ''
WHERE bb.ACCT = 1111 AND bb.tType = 'C'
;
 
우욱님이 2014-07-14 00:47에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
6836두테이블에서 한테이블에 없는값 가져오기 [2]
둥둥이
2014-07-28
6437
6834기존 자료 검색 후 중복제거후 insert 하는 방법을 알고 싶습니다. [3]
꽃씨하나
2014-07-21
8408
6833간단한 쿼리 질문드립니다. [1]
질문이요
2014-07-17
6589
6832자식 로우 찾기 2 [1]
우세연
2014-07-13
6948
6831sql server 링크드 서버를 이용한 oracle 함수 사용 [1]
핸시기
2014-07-09
7955
6830프로시저에서 리턴된 SELECT 문이 2개인데 하나만 받을 수 없을까요 [5]
홍두표
2014-07-09
7522
68280으로나누기 오류나요 [2]
김우성
2014-07-05
7237
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.023초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다