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 4196 게시물 읽기
No. 4196
Cross Join에서 Group을 어떻게 쓰는지...
작성자
이만실
작성일
2008-04-29 11:05ⓒ
2008-04-29 11:33ⓜ
조회수
4,598

*****  아래의 3434번글에 이어서 드리는 질문 입니다. *****

이 곳에서 도움을 많이 받고 있는 SQL입문자 입니다.

테이블 bill(메인테이블) 과 man 이 연결 되어 있구요.


bill 테이블의 GrandTotal 과 SubTotal이 값이 있으면
레코드를 분리해서 두개를 만들었습니다.
(GrandTotal 과 SubTotal에 값이 같이 있으면 masterman 과 subman 필드에도 값이 들어 있습니다.)

이곳의 고수 분들의 도움을 받아 아래와 같은 쿼리를 작성했는데
Group 에서 막혀 이렇게 또 도움을 청합니다.


Bill 이라는 한개의 테이블에

=====================================================================
a_id   invdate  Cuscod  masterman   subman   GrandTotal    SubTotal
=====================================================================
1     20080120    0001           01                               400             0
2     20080120    0002           02               01             500          200   -->2개로 나눠짐
3     20080120    0003           03                               100             0
4     20080120    0003           03               04             300          100   -->2개로 나눠짐
=====================================================================

이라는 4개의 레코드가 있는데 이중에
SubTotal 필드의 값이 0인경우엔(subman가 자료가 없음) 레코드가 그대로 보여지고


0이 아니경우엔(subman에 특정 자료가 있음) 레코드들 하나 추가해서 WHERE masterman between '01' AND '99' 하는식의 조건을 걸고
아래와 같이 보여주는 방법은 없는지요 고수님들의 도움을 부탁 드립니다.

cross join을 사용하면 된다고 하는데... 제가 너무 초보라서요.

=============================================================================
a_id   invdate  Cuscod  masterman   subman   GrandTotal SubTotal
=============================================================================
1     20080120    0001     01                   400          0        SubTotal이 0이므로 불변
-----------------------------------------------------------------------------
2     20080120    0002     02                   300          0        두개로 분리 하여 합하면
3     20080120    0002     01                   200          0        기존레코드 1개와 일치
-----------------------------------------------------------------------------
4     20080120    0003     03                   100          0        SubTotal이 0이므로 불변
-----------------------------------------------------------------------------
5     20080120    0003     03                   200          0        두개로 분리 하여 합하면
6     20080120    0003     04                   100          0        기존레코드 1개와 일치
=============================================================================

Group1 = masterman 또는 man_user_serial
Group2 = yymm
Group3 = cuscod
를 이용해서

======================================================================
 masterman   yymm   cuscod   Sum( amount )
======================================================================
     01      0801    0001      400
     01      0801    0002      200
----------------------------------------------------------------------
     02      0801    0002      300
----------------------------------------------------------------------
     03      0801    0003      300(위 4번과 5번레코드의 합)
----------------------------------------------------------------------
     04      0801    0003      100
----------------------------------------------------------------------
과 같은 자료를 얻고 싶은데 어찌하면 좋을지 도움을 부탁 드립니다.

 

SELECT  Q.* FROM ( SELECT
masterman  = CASE WHEN X = 1 THEN A.masterman ELSE A.subman END ,
yymm       = mid(Left(A.invdate,3,4) ,
cuscod     = A.cuscod          ,
amount     = CASE WHEN X = 1 THEN A.GrandTotal - A.SubTotal ELSE A.SubTotal END ,
man_user_name_kor = Man.user_name_kor ,
man_user_taxno    = Man.user_taxno    ,
man_user_serial   = Man.user_serial   ,
invdate           = A.invdate         ,
subman            = A.subman          ,
taxornot          = A.taxornot        ,
two_comp          = A.two_comp
FROM bill A CROSS JOIN  ( SELECT X = 1 UNION  ALL  SELECT 2  )  B , man , palet )  Q
WHERE
( masterman = man_user_hobong ) AND
( invdate between '20080101' AND '20080228' ) AND
((masterman  between '01' AND '99' )  OR
( subman  between '01' AND '99' )) AND
( taxornot = 0 ) AND ( amount > 0 ) AND
( two_comp = 0 )

여기까진 도움을 받아 했는데 group을 이용한 결과를 얻질 못하고 있습니다. 
도움을 부탁 드립니다.
 

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

 
WITH TESTA AS
(
SELECT A_ID = 1, INVDATE = '20080120', CUSCOD = '0001', MASTERMAN = '01', SUBMAN = NULL  , GRANDTOTAL = 400, SUBTOTAL = 0 UNION ALL
SELECT A_ID = 2, INVDATE = '20080120', CUSCOD = '0002', MASTERMAN = '02', SUBMAN = '01'  , GRANDTOTAL = 500, SUBTOTAL = 200  UNION ALL
SELECT A_ID = 3, INVDATE = '20080120', CUSCOD = '0003', MASTERMAN = '03', SUBMAN = NULL  , GRANDTOTAL = 100, SUBTOTAL = 0    UNION ALL
SELECT A_ID = 4, INVDATE = '20080120', CUSCOD = '0003', MASTERMAN = '03', SUBMAN = '04'  , GRANDTOTAL = 300, SUBTOTAL = 100 
)
SELECT
 MASTERMAN
 , YYMM
 , CUSCOD
 , AMOUNT = SUM(GRANDTOTAL)
FROM (
SELECT
 A_ID
 , YYMM  = SUBSTRING(INVDATE, 3, 4)
 , CUSCOD
 , MASTERMAN  = CASE WHEN X = 1 THEN MASTERMAN ELSE SUBMAN END
 , GRANDTOTAL = CASE WHEN X = 1 THEN GRANDTOTAL-SUBTOTAL ELSE SUBTOTAL END

FROM
 TESTA A
 CROSS JOIN (SELECT X = 1 UNION ALL SELECT 2 ) B
WHERE  (CASE WHEN X = 1 THEN MASTERMAN ELSE SUBMAN END) IS NOT NULL
) Q
GROUP BY
 MASTERMAN, YYMM, CUSCOD
 

.님이 2008-04-29 18:30에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
4199서브쿼리내에서 그룹핑 후 그룹에 값이 없을 경우..ㅠ.ㅠ [2]
김경호
2008-05-10
4490
4198ms-sql 패키지 관련 급 질문~ [1]
런던
2008-04-30
3795
4197RESTORE FILELISTONLY 에러문구.. [1]
강민석
2008-04-30
7675
4196Cross Join에서 Group을 어떻게 쓰는지... [1]
이만실
2008-04-29
4598
4194group by 를 해서 업데이트 시킬때.. [1]
손님
2008-04-28
4827
4193조인하기
이인우
2008-04-28
4412
4192[Microsoft][ODBC SQL Server Driver]수 필드가 잘못되었거나 구문 오류입니다.
심영진
2008-04-26
6891
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다