Q&A

  • sql sum()에서 가감할 수 있나요?
제목이 좀이상하죠?



한 테이블에 입고,출고 내역이 있습니다.



번호 품명 종류 수량.....

001 a 1 10

002 b 1 10

003 a 2 5



-> 종류가 '1'이면 입고이고, '2'면 출고지요.



이테이블을 집계해서리....



품목 재고량

a 5

b 10

를 뽑아내야 합니다.



그래서

select 품명

, '재고량' =

case

when 종류 = '1' then sum(수량)

else sum(-수량)

end

from 입출테이블

GROUP BY 품명, 종류



했더니.... 글쌔



품명 재고량

a 10

a -5

b 10



나오지 않겠습니까? 나 참 기가막혀서리......



제발 좀 도와 주시기 바랍니다.



** 추가로 데이터 모듈에있는 쿼리를 또 쿼리할 수 없는지요?

위의 내용을 쿼리해서 또 쿼리할려고 했더니 그것도 않되는군요..



4  COMMENTS
  • Profile
    최혜룡 2001.04.26 06:54
    mssql을 모르는 관계로 oracle로 한다면 (DB가 현재 없는지라 TEST는 못해봄)



    SELECT 품명,

    SUM(DECODE(종류,1,수량)) - SUM(DECODE(종류,2,수량))

    FROM 입출고TABLE

    GROUP BY 품명





    남중희 wrote:

    > 제목이 좀이상하죠?

    >

    > 한 테이블에 입고,출고 내역이 있습니다.

    > 즉

    > 번호 품명 종류 수량.....

    > 001 a 1 10

    > 002 b 1 10

    > 003 a 2 5

    >

    > -> 종류가 '1'이면 입고이고, '2'면 출고지요.

    >

    > 이테이블을 집계해서리....

    >

    > 품목 재고량

    > a 5

    > b 10

    > 를 뽑아내야 합니다.

    >

    > 그래서

    > select 품명

    > , '재고량' =

    > case

    > when 종류 = '1' then sum(수량)

    > else sum(-수량)

    > end

    > from 입출테이블

    > GROUP BY 품명, 종류

    >

    > 했더니.... 글쌔

    >

    > 품명 재고량

    > a 10

    > a -5

    > b 10

    >

    > 나오지 않겠습니까? 나 참 기가막혀서리......

    >

    > 제발 좀 도와 주시기 바랍니다.

    >

    > ** 추가로 데이터 모듈에있는 쿼리를 또 쿼리할 수 없는지요?

    > 위의 내용을 쿼리해서 또 쿼리할려고 했더니 그것도 않되는군요..

    >

  • Profile
    이재식 2001.04.30 20:01
    얼핏 떠오르는 논리를 생각해본다면,

    이런경우에는 2차 group by가 이루어져야 한다고 생각합니다.

    1차 group by 로 한다면 코딩상으로 하기보단

    테이블의 설계로 간단히 해결할수 있죠.

    아시죠? 어떻게 하면 아주 간단히 해결할수 있는지....



    아직은 보통 테이블설계는 주키필드/일반필드로 나누는 정도이지만,

    앞으론 수준있는 설계로 코딩의 난이도와 양을 줄이는 그런 고급단계가

    점차 확산되기를 바라면서.... 큭큭



    말씀드렸든 얼핏 떠오로는 저의 논리를 함 이야기해볼게요.

    님께서 하신 쿼리는 기가막힌것이 아니라, 당연한 결과입니다. ^^



    이렇게 함 해보세요.

    먼저 뷰를 만듭니다.

    인라인 뷰든 일반 뷰든 이렇게 만들어 보세요.

    create view TempView(품명, 종류, 수량)

    as

    select 품명, 종류, decode(종류, '1', sum(수량), '2', -sum(수량))

    from temp

    group by 품명, 종류



    그런다음 이렇게 쿼리를 던지면 되죠.



    select 품명, sum(수량) from TempView group by 품명





    저는 SQL SERVER환경이 아니라, 오라클로 했습니다.

    decode대신에 case문을 쓰시면 되죠. ^^



    그럼, 도움이 되셨기를....



    아님, 뷰를 쓰기 원치 않으신다면 이런 방법도 있습죠



    select pumname, sum(decode(jong, '1', surang))

    - nvl(sum(decode(jong, '2', surang)), 0) value

    from temp

    group by pumname



    pumname는 품명, jong는 종류(1 또는 2값), surang는 수량

    두번째 sum에서 nvl를 해준이유는 입고는 있되 출고는 없을수 있기때문에.



    쿼리가 좀 약간 어설프지만, 잘 생각하셔서 좋은 결과 있기를....바랍니다.

  • Profile
    .. 2001.04.25 20:16
    품명별로 group by 를 하시는 부분이 빠진것 같습니다.



    남중희 wrote:

    > 제목이 좀이상하죠?

    >

    > 한 테이블에 입고,출고 내역이 있습니다.

    > 즉

    > 번호 품명 종류 수량.....

    > 001 a 1 10

    > 002 b 1 10

    > 003 a 2 5

    >

    > -> 종류가 '1'이면 입고이고, '2'면 출고지요.

    >

    > 이테이블을 집계해서리....

    >

    > 품목 재고량

    > a 5

    > b 10

    > 를 뽑아내야 합니다.

    >

    > 그래서

    > select 품명

    > , '재고량' =

    > case

    > when 종류 = '1' then sum(수량)

    > else sum(-수량)

    > end

    > from 입출테이블

    > GROUP BY 품명, 종류

    >

    > 했더니.... 글쌔

    >

    > 품명 재고량

    > a 10

    > a -5

    > b 10

    >

    > 나오지 않겠습니까? 나 참 기가막혀서리......

    >

    > 제발 좀 도와 주시기 바랍니다.

    >

    > ** 추가로 데이터 모듈에있는 쿼리를 또 쿼리할 수 없는지요?

    > 위의 내용을 쿼리해서 또 쿼리할려고 했더니 그것도 않되는군요..

    >

  • Profile
    나니앤 2001.04.25 23:25
    select 품명, sum(case when 품명='1' then 수량 else -(수량) end)

    from 입출테이블

    group by 품명