select
a.item_code,a.outstock_i,
CASE ISNULL(SUM(A.STOCK_Q),0) WHEN 0 THEN
ISNULL(sum (CASE A.BASIS_YYYYMM WHEN '200701' THEN A.BASIS_AMOUNT_I END),0) +
(isnull(sum(A.INSTOCK_I),0))
ELSE isnull(sum(A.OUTSTOCK_I),0) END SI_OUTSTOCK_Q,
stock_i,
CASE ISNULL(SUM(A.STOCK_Q),0) WHEN 0 THEN 0 ELSE
(ISNULL(sum (CASE A.BASIS_YYYYMM WHEN '200701' THEN A.BASIS_AMOUNT_I END),0)
+ISNULL(sum((A.INSTOCK_I)),0) - ISNULL(sum((A.OUTSTOCK_i)),0))END SI_STOCK_Q
from miv200t a,BPR100TV B where A.ITEM_CODE = B.ITEM_CODE
AND A.DIV_CODE=B.DIV_CODE and basis_yyyymm='200701' and stock_q=0 and stock_i<>0
group by a.item_code, a. outstock_i, a.stock_i
다음과 같이 검색하면 여러개의 필드가 검색이 되거드요
이것을 다음과 같이 여러개의 필드들을 각각 동시에 처리하고 싶은데...
그래서 다음과 같이 프로그램을 작성 했거든요.......
update a set
a.outstock_i = CASE ISNULL(SUM(A.STOCK_Q),0) WHEN 0 THEN
ISNULL(sum (CASE A.BASIS_YYYYMM WHEN '200701' THEN A.BASIS_AMOUNT_I END),0) + (isnull(sum(A.INSTOCK_I),0)) ELSE isnull(sum(A.OUTSTOCK_I),0)END,
a.stock_i= CASE ISNULL(SUM(A.STOCK_Q),0) WHEN 0 THEN 0 ELSE
(ISNULL(sum (CASE A.BASIS_YYYYMM WHEN '200701' THEN A.BASIS_AMOUNT_I END),0) +ISNULL(sum((A.INSTOCK_I)),0) - ISNULL(sum((A.OUTSTOCK_i)),0))END
from miv200t a,BPR100TV B
where A.ITEM_CODE = B.ITEM_CODE
AND A.DIV_CODE=B.DIV_CODE
and basis_yyyymm='200701'
and stock_q=0 and stock_i<>0
group by a.item_code, a. outstock_i, a.stock_i
그런데 group by 부분을 실행할 수 없다고 하네요..
그럼 아래와 같이 일일이 1:1로 업데이트를 해야 하는건가요?
update miv200t set OUTSTOCK_I = (INSTOCK_I+BASIS_AMOUNT_I) WHERE ITEM_CODE='AB040002' AND BASIS_yyyyMM='200610'
update miv200t set stock_i=0 WHERE ITEM_CODE='AB040002' AND BASIS_yyyyMM='200610'
한번에 여러 필드를 각각 UPDATE SET 하는 방법은 없나요?
------------------------------------------------------------------------------------------------------------------------
DB종류는 정확히 모르겠으나, 오라클냄새가 많이 나서 오라클기준으로 말씀드리겠습니다.
MSSQL등 일부DB는 update시 from절에서 join처리까지 하면서 할 수 있는 걸로 알고 있습니다.
이런 경우는 join한 select문을 적당히 join한 update로 풀어내면 가능하겠지요...
이 부분은 테스트환경이 안되니 환경이 가능하면 직접 해 보시기 바랍니다.
또한 님의 DB가 오라클이 아니라면 님의 DB에서 아래처럼 update시 from절 또는 조인처리가 가능한지 먼저 살펴보시기 바랍니다.
예) UPDATE a
SET a.col1 = b.col1
, a.col2 = b.col2
FROM b
WHERE a.key = b.key
AND 나머지조건....
또는 ANSI JOIN SQL로...
UPDATE a INNER JOIN b ON a.key = b.key
SET a.col = b.col
, a.col2 = b.col2
WHERE 나머지조건...
하지만 오라클등 또 다른 일부 DB들은 update문 자체의 from절에서의 join을 허용하지 않습니다.
그래서 특히 오라클DB를 사용하는 유저들은 update시 이런 문제를 일반적으로 아래와 같이 풉니다.
편의상 간략화하여 제시해 드리니 아래 구문에 맞춰서 직접변경하여 구현 해 보세요~~
UPDATE a
SET (a.code, a.col1, a.col2, a.col3) =
(SELECT code1, col1, col2, col3 --> SET의 괄호안의 컬럼들과 대치되는 순서로 나열해야 함
FROM(
SELECT group-keys AS code1, sum(a) AS col1, sum(b) AS col2, sum(c) AS col3
FROM B, C
WHERE 조인조건
GROUP BY group-keys
) bc
WHERE bc.조인키 = a.조인키
)
WHERE a테이블 자체의 update대상범위 추출조건
AND EXISTS
(SELECT 1
FROM(
SELECT group-keys
FROM B, C
WHERE 조인조건
GROUP BY group-keys
) bc
WHERE bc.조인키 = a.조인키
) --> 이 조건을 안쓰면 Join과 관계없는 엉뚱한 row들도 Null로 Update되니 반드시 써야합니다.
건승하시길...수고하세요