제가 좀 초짜인지라... AMT를 다른테이블로 업데이트하고싶은데 잘안되네요..
UPDATE M_GRADING_DTL_20160216 SET AMT = M_GRADING_DTL_20160216.ST_IV_AMT
(case when a.SEX_CD= '1' AND a.LAST_GRADE='1+' AND b.WORK_FLG='0' THEN b.CARCASS_PRICE * a.DEAD_WEIGHT
when a.SEX_CD= '1' AND a.LAST_GRADE='1' AND b.WORK_FLG='1' THEN b.CARCASS_PRICE * a.DEAD_WEIGHT
when a.SEX_CD= '1' AND a.LAST_GRADE='2' AND b.WORK_FLG='2'THEN b.CARCASS_PRICE * a.DEAD_WEIGHT
when a.SEX_CD= '3' AND a.LAST_GRADE='1+' AND b.WORK_FLG='6'THEN b.CARCASS_PRICE * a.DEAD_WEIGHT
when a.SEX_CD= '3' AND a.LAST_GRADE='1' AND b.WORK_FLG='7'THEN b.CARCASS_PRICE * a.DEAD_WEIGHT
when a.SEX_CD= '3' AND a.LAST_GRADE='2' AND b.WORK_FLG='8'THEN b.CARCASS_PRICE * a.DEAD_WEIGHT
when a.SEX_CD= '2' AND a.LAST_GRADE='등외' AND b.WORK_FLG='9'THEN b.CARCASS_PRICE * a.DEAD_WEIGHT
END) AMT <---요거를 업데이트
FROM M_GRADING_DTL A
INNER JOIN M_IV_HDR D ON D.IV_NO = A.IV_NO
LEFT join M_PIG_DAILY_PRICE b ON b.WORK_DT=D.IV_DT
WHERE D.IV_DT='20150206'
and A.BP_CD='02-0042'
Comment 18
-
HoyaSoft
2016.02.16 17:40
-
큘러
2016.02.16 18:03
말씀대로 한개의 케이스밖에 인지를 못하네요.여러조건을 인식 못해요.
제가 case를 잘안써봐서요. 현재상태로 값에 맞춰 케이스를 어떻게 써야 하나요?
else 값에 다른값을 쓸데 없서서요.
도움 부탁드립니다.
-
Terry
2016.02.16 18:36
하기 쿼리 참고하세요..
구문은 맞게 해두었는데..
Left Outer Join 이 좀 걸리네요 ^^;;
테이블 구조가 1:N 일 경우 오류 날겁니다..
M_GRADING_DTL_20160216 테이블과
M_GRADING_DTL 테이블의 키가 동일하다면..
하기 쿼리문에서 Join 되는 키 를 실제 대칭되는 컬럼으로 수정하시구요.
---쿼리시작---
UPDATE X
SET
X.amt = (
CASE WHEN A.SEX_CD = '1' AND A.LAST_GRADE = '1+' AND B.WORK_FLG = '0'
THEN B.CARCASS_PRICE * A.DEAD_WEIGHT
WHEN A.SEX_CD = '1' AND A.LAST_GRADE = '1' AND B.WORK_FLG = '1'
THEN B.CARCASS_PRICE * A.DEAD_WEIGHT
WHEN A.SEX_CD = '1' AND A.LAST_GRADE = '2' AND B.WORK_FLG = '2'
THEN B.CARCASS_PRICE * A.DEAD_WEIGHT
WHEN A.SEX_CD = '3' AND A.LAST_GRADE = '1+' AND B.WORK_FLG = '6'
THEN B.CARCASS_PRICE * A.DEAD_WEIGHT
WHEN A.SEX_CD = '3'AND A.LAST_GRADE = '1' AND B.WORK_FLG = '7'
THEN B.CARCASS_PRICE * A.DEAD_WEIGHT
WHEN A.SEX_CD = '3' AND A.LAST_GRADE = '2' AND B.WORK_FLG = '8'
THEN B.CARCASS_PRICE * A.DEAD_WEIGHT
WHEN A.SEX_CD = '2' AND A.LAST_GRADE = '등외' AND B.WORK_FLG = '9'
THEN B.CARCASS_PRICE * A.DEAD_WEIGHT
END
)
From M_GRADING_DTL_20160216 A
INNER JOIN M_GRADING_DTL A ON A.키 = X.키
INNER JOIN M_IV_HDR D ON D.IV_NO = A.IV_NO
LEFT JOIN M_PIG_DAILY_PRICE B ON B.WORK_DT = D.IV_DT
WHERE D.IV_DT = '20150206'
AND A.BP_CD = '02-0042'
-
큘러
2016.02.16 19:18
UPDATE X
SET
X.ST_IV_AMT =(
CASE WHEN A.SEX_CD = '1' AND A.LAST_GRADE = '1+' AND B.WORK_FLG = '0'
THEN B.CARCASS_PRICE * A.DEAD_WEIGHT
WHEN A.SEX_CD = '1' AND A.LAST_GRADE = '1' AND B.WORK_FLG = '1'
THEN B.CARCASS_PRICE * A.DEAD_WEIGHT
WHEN A.SEX_CD = '1' AND A.LAST_GRADE = '2' AND B.WORK_FLG = '2'
THEN B.CARCASS_PRICE * A.DEAD_WEIGHT
WHEN A.SEX_CD = '3' AND A.LAST_GRADE = '1+' AND B.WORK_FLG = '6'
THEN B.CARCASS_PRICE * A.DEAD_WEIGHT
WHEN A.SEX_CD = '3'AND A.LAST_GRADE = '1' AND B.WORK_FLG = '7'
THEN B.CARCASS_PRICE * A.DEAD_WEIGHT
WHEN A.SEX_CD = '3' AND A.LAST_GRADE = '2' AND B.WORK_FLG = '8'
THEN B.CARCASS_PRICE * A.DEAD_WEIGHT
WHEN A.SEX_CD = '2' AND A.LAST_GRADE = '등외' AND B.WORK_FLG = '9'
THEN B.CARCASS_PRICE * A.DEAD_WEIGHT
END
)
From M_GRADING_DTL_20160216 A
INNER JOIN M_GRADING_DTL C ON A.IV_DT = X.IV_DT
INNER JOIN M_IV_HDR D ON D.IV_NO = A.IV_NO
LEFT JOIN M_PIG_DAILY_PRICE B ON B.WORK_DT = D.IV_DT
WHERE D.IV_DT = '20150206'
AND A.BP_CD = '02-0042'메시지 207, 수준 16, 상태 1, 줄 23
열 이름 'IV_DT'이(가) 잘못되었습니다.
메시지 4104, 수준 16, 상태 1, 줄 23
여러 부분으로 구성된 식별자 "X.IV_DT"은(는) 바인딩할 수 없습니다. -
Terry
2016.02.16 19:26
실수했네요 ㅠ.ㅠ
From M_GRADING_DTL_20160216 A
저 부분을
From M_GRADING_DTL_20160216 X
저렇게 수정하고 시도해보세요~~
-
큘러
2016.02.16 20:15
이것도 오류는안나는데... ㅜㅜ case 문도 첫case 한번만 돌아요. 실제로는 이게 중요한데요.. 여러조건검색...... 같은값이 테이블로 업데이트 됩니다. 동일값으로
-
처리짱
2016.02.17 12:58
update구문에 있는 case를 select로 찍어 보세요. case 문이 문법상 문제는 없어보이네요.
THEN 이후에 값이 모두 다 똑같네요..
-
큘러
2016.02.17 14:14
Then 이후값이 똑같은게 문제가 되나요? 다른값은 없는데요. 꼭 저공식이어야 하는데...
-
Terry
2016.02.17 14:47
현재 질문자님이 제시해주신 것만 토대로 유추했을때는
문제될게 없어보입니다..
문법도 문제될건 없어보이구요.
하기 데이터들이 추가로 첨부가 되면
다른분들이 도움주실수 있을듯하네요.
1.해당 테이블들의 샘플 데이터
2.CASE WHEN 세부 조건
3.변경하고자 하는 값 ( UPDATE 전과 비교하면 더 좋겠죠?)
-
큘러
2016.02.17 15:09
WORK_DT WORK_FLG BASIC_UNIT CARCASS_PRICE 3PRICE REMARK CUSER CDATE UUSER UDATE
20150206 0 KG 5107.0000 5216.0000 NULL MPSADMIN 2006-06-23 15:09:36.000 NULL NULL
20150206 1 KG 5031.0000 5030.0000 NULL MPSADMIN 2006-06-23 15:09:36.000 NULL NULL
20150206 2 KG 4815.0000 4841.0000 NULL MPSADMIN 2006-06-23 15:09:36.000 NULL NULL
20150206 4 KG 3274.0000 3330.0000 NULL MPSADMIN 2006-06-23 15:09:36.000 NULL NULL
20150206 5 KG 3308.0000 3440.0000 NULL MPSADMIN 2006-06-23 15:09:36.000 NULL NULL
20150206 6 KG 4745.0000 4867.0000 NULL MPSADMIN 2006-06-23 15:09:36.000 NULL NULL
20150206 7 KG 4758.0000 4774.0000 NULL MPSADMIN 2006-06-23 15:09:36.000 NULL NULL
20150206 8 KG 4503.0000 4517.0000 NULL MPSADMIN 2006-06-23 15:09:36.000 NULL NULL
20150206 9 KG 3743.0000 3593.0000 NULL MPSADMIN 2006-06-23 15:09:36.000 NULL NULL선택된날짜의 3PRICE의 값을 WORK_FLG값을 CASE에서 유출해서 아래 테이블의 SEX_CD와 LAST GRADE값과 같이 조건을 걸어
검색후 검색된 3PRICE값에 DEAD_WEIGHT 값을 곱해 ST_IV_AMT에 업데이트 하는 쿼리입니다.
BUTCHERY_DT BUTCHERY_CD BP_CD BUTCHERY_NO SEX_CD QTY LIVE_WEIGHT DEAD_WEIGHT BACKFAT_THICK LAST_GRADE ST_FLG ST_IV_AMT NST_IV_AMT IV_NO IV_SEQ IV_FLG BEFORE_GRADE REPRE_RGST_NM REPRE_RGST_NO INPUT_FLG CUSER CDATE UUSER UDATE
20150205 19-1002 02-0042 1968 1 1 114.7600 87.0000 16.0000 1+ Y 409195.0000 0.0000 IV201502060032 1 Y 1+ 최만영위데이터는 SEX_CD='1' LAST_GRADE='1+' 업데이트를 쳐질 금액이 409195.0000 입니다.
-
더따뜻한
2016.02.17 15:01
Then 이후값이 똑같으니까~ 같은 값으로 업데이트 되는 거 아닐까요? ^^ ( CASE문 사용이 조금 이상한거 같긴해요. )
질문의 내용은 너무 광범위해서 잘 모르겠지만... 쿼리를 통해 생각해보면~
제 생각에는 CASE 에 작성하신 조건별로 B.CARCASS_PRICE * A.DEAD_WEIGHT 요 내용을 SUM 된 값을 M_GRADING_DTL_20160216 테이블에 업데이트 하려고 하시는 것 같은데...
만약 그렇다면 SUM을 따로 한 후 그걸 SUBQUERY로 조인을 해주는게 좋다구 생각합니다. 구
-
Terry
2016.02.17 15:48
주신자료 토대로 임의로 Select 쿼리 만들어봤어요.
전 여기까지 ^^;;
하기 쿼리 참고하세요..
그리구 실제 Update 전에
Select 로 Case 조건이 제대로 들어가고 있는지
확인하셔야 될겁니다.
테이블로 유추했을때는 특정테이블 ( M_GRADING_DTL )
에 대해 일자별로 History 테이블을 생성하고
해당 테이블에 데이터 Insert 및 Update 하는걸로 예상이 됩니다.
현재 주어진 데이터로 제 실력으로는 여기가 한계입니다-_-;;;
성공하시길..~
---쿼리끝---
;with tblA(WORK_DT ,WORK_FLG ,BASIC_UNIT ,CARCASS_PRICE ,[3PRICE] ,REMARK ,CUSER ,CDATE ,UUSER, UDATE) As
(
Select '20150206' ,'0' ,'KG' ,5107.0000 ,5216.0000 ,NULL ,'MPSADMIN' ,'2006-06-23 15:09:36.000' ,Null,Null Union All
Select '20150206' ,'1' ,'KG' ,5031.0000 ,5030.0000 ,NULL ,'MPSADMIN' ,'2006-06-23 15:09:36.000' ,Null,Null Union All
Select '20150206' ,'2' ,'KG' ,4815.0000 ,4841.0000 ,NULL ,'MPSADMIN' ,'2006-06-23 15:09:36.000' ,Null,Null Union All
Select '20150206' ,'4' ,'KG' ,3274.0000 ,3330.0000 ,NULL ,'MPSADMIN' ,'2006-06-23 15:09:36.000' ,Null,Null Union All
Select '20150206' ,'5' ,'KG' ,3308.0000 ,3440.0000 ,NULL ,'MPSADMIN' ,'2006-06-23 15:09:36.000' ,Null,Null Union All
Select '20150206' ,'6' ,'KG' ,4745.0000 ,4867.0000 ,NULL ,'MPSADMIN' ,'2006-06-23 15:09:36.000' ,Null,Null Union All
Select '20150206' ,'7' ,'KG' ,4758.0000 ,4774.0000 ,NULL ,'MPSADMIN' ,'2006-06-23 15:09:36.000' ,Null,Null Union All
Select '20150206' ,'8' ,'KG' ,4503.0000 ,4517.0000 ,NULL ,'MPSADMIN' ,'2006-06-23 15:09:36.000' ,Null,Null Union All
Select '20150206' ,'9' ,'KG' ,3743.0000 ,3593.0000 ,NULL ,'MPSADMIN' ,'2006-06-23 15:09:36.000' ,Null,Null
)
,tblB(BUTCHERY_DT ,BUTCHERY_CD ,BP_CD ,BUTCHERY_NO ,SEX_CD ,QTY ,LIVE_WEIGHT ,DEAD_WEIGHT ,BACKFAT_THICK ,LAST_GRADE ,ST_FLG ,ST_IV_AMT ,NST_IV_AMT ,IV_NO ,IV_SEQ ,IV_FLG ,BEFORE_GRADE ,REPRE_RGST_NM ,REPRE_RGST_NO ,INPUT_FLG,CUSER,CDATE,UUSER,UDATE) As
(
Select '20150205' ,'19-1002' ,'02-0042' ,1968 ,1 ,1 ,114.7600 ,87.0000 ,16.0000 ,'1+' ,'Y' ,409195.0000 ,0.0000 ,'IV201502060032' ,1 ,'Y' ,'1+' ,'최만영' ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL
)
Select
amt = (
CASE WHEN A.SEX_CD = '1' AND A.LAST_GRADE = '1+' AND B.WORK_FLG = '0'
THEN B.CARCASS_PRICE * A.DEAD_WEIGHT
WHEN A.SEX_CD = '1' AND A.LAST_GRADE = '1' AND B.WORK_FLG = '1'
THEN B.CARCASS_PRICE * A.DEAD_WEIGHT
WHEN A.SEX_CD = '1' AND A.LAST_GRADE = '2' AND B.WORK_FLG = '2'
THEN B.CARCASS_PRICE * A.DEAD_WEIGHT
WHEN A.SEX_CD = '3' AND A.LAST_GRADE = '1+' AND B.WORK_FLG = '6'
THEN B.CARCASS_PRICE * A.DEAD_WEIGHT
WHEN A.SEX_CD = '3'AND A.LAST_GRADE = '1' AND B.WORK_FLG = '7'
THEN B.CARCASS_PRICE * A.DEAD_WEIGHT
WHEN A.SEX_CD = '3' AND A.LAST_GRADE = '2' AND B.WORK_FLG = '8'
THEN B.CARCASS_PRICE * A.DEAD_WEIGHT
WHEN A.SEX_CD = '2' AND A.LAST_GRADE = '등외' AND B.WORK_FLG = '9'
THEN B.CARCASS_PRICE * A.DEAD_WEIGHT
END
)
,A.*
,B.*
From tblB A
Left Outer Join tblA B On B.WORK_DT >= A.BUTCHERY_DT---쿼리끝---
-
항해자™
2016.02.17 16:08
위 질문의 답은 질문자의 쿼리를 그대로 활용할 수 밖에 없는 상황인데,
현재 질문에 기록된 case문의 then 이후가 b.CARCASS_PRICE * a.DEAD_WEIGHT로 모두 동일합니다.
조건에 따른 결과를 변경해 보세요,,,
case when 조건 then 결과 end
-
큘러
2016.02.17 16:40
이게 저도 해매는게 select에서는 조건값대로 읽혀드립니다. 근데 업데이트를 하면 한가지 조건만 골라서 업데이트 합니다,
그러니 계속 제자리 걸음입니다.
-
처리짱
2016.02.17 17:24
한가지 조건만 골라서 업데이트를 하는게 아니라 THEN 이후에 결과값이 모두 같으니 CASE 문에서 분기가 되도 결과값이 모두 같아 한가지 조건만 골라서 업데이트가 되는것 처럼 보이는게 아닐까요..SELECT 를 해보시면 바로 보일텐데요...아래와 같이 바꿔서 실행을 해보세요CASE WHEN A.SEX_CD = '1' AND A.LAST_GRADE = '1+' AND B.WORK_FLG = '0'
THEN 1
WHEN A.SEX_CD = '1' AND A.LAST_GRADE = '1' AND B.WORK_FLG = '1'
THEN 2
WHEN A.SEX_CD = '1' AND A.LAST_GRADE = '2' AND B.WORK_FLG = '2'
THEN 3
WHEN A.SEX_CD = '3' AND A.LAST_GRADE = '1+' AND B.WORK_FLG = '6'
THEN 4
WHEN A.SEX_CD = '3'AND A.LAST_GRADE = '1' AND B.WORK_FLG = '7'
THEN 5
WHEN A.SEX_CD = '3' AND A.LAST_GRADE = '2' AND B.WORK_FLG = '8'
THEN 6
WHEN A.SEX_CD = '2' AND A.LAST_GRADE = '등외' AND B.WORK_FLG = '9'
THEN 7
END -
큘러
2016.02.17 18:00
then 값을 바꿔도 결과적으로 업데이트하면 역시나 첫조건만 골라서 업데이트 칩니다.
이젠 돌겠네요.
-
처리짱
2016.02.17 19:27
SELECT A.SEX_CD, A.LAST_GRADE, B.WORK_FLG, *
From M_GRADING_DTL_20160216 A
INNER JOIN M_GRADING_DTL C ON A.IV_DT = X.IV_DT
INNER JOIN M_IV_HDR D ON D.IV_NO = A.IV_NO
LEFT JOIN M_PIG_DAILY_PRICE B ON B.WORK_DT = D.IV_DT
WHERE D.IV_DT = '20150206'
AND A.BP_CD = '02-0042'위 쿼리로 값을 확인해 보세요.
조인이 잘못됬을겁니다. INNER JOIN, LEFT JOIN이 썩여 있는게 영 보기는 않좋네요 ;;;
값은 CASE 문에 것처럼 각각 나오는데 업데이트가 첫번째 꺼만 된다면. 1대1매칭에서..
심각한 버그입니다. 마이크로 소프트에 신고해야합니다. !!
-
더따뜻한
2016.02.17 18:14
제가 테이블 구조나 그런거 잘 모르겠고, 제가 자세히 볼 시간은 없으나~ 아래와 같은 쿼리로 해보시믄~ 어떨까요?
아래쿼리 구조를 참고만 해보세요.
UPDATE A
SET A.ST_IV_AMT = X.AMT
From M_GRADING_DTL_20160216 A
INNER JOIN M_GRADING_DTL C ON A.IV_DT = X.IV_DT
INNER JOIN M_PIG_DAILY_PRICE B ON B.WORK_DT = D.IV_DT
INNER JOIN (--// 이런식으로 먼저 집계를 한 뒤 하위쿼리로 붙여서 업데이트를 해보세요.
SELECT A.SEX_CD, A.LAST_GRADE, A.WORK_FLG
, SUM( ISNULL(b.CARCASS_PRICE,0) * ISNULL(a.DEAD_WEIGHT,0)) AS AMT
FROM M_GRADING_DTL A
INNER JOIN M_IV_HDR D ON D.IV_NO = A.IV_NO
LEFT join M_PIG_DAILY_PRICE b ON b.WORK_DT=D.IV_DT
WHERE D.IV_DT='20150206'
and A.BP_CD='02-0042'
GROUP BY A.SEX_CD, A.LAST_GRADE, A.WORK_FLG
) X ON ( X.SEX_CD = A.SEX_CD AND X.LAST_GRADE = A.LAST_GRADE AND X.WORK_FLG = B.WORK_FLG )
WHERE D.IV_DT = '20150206'
AND A.BP_CD = '02-0042'
제가 초보라서 그런지 모르겠는데.. 적어주신 업데이트 구분 문법이 상당히 이상합니다.. ㅎ
일단 정상적인 쿼리로 수정한거 올려드립니다.
UPDATE M_GRADING_DTL_20160216
SET AMT = CASE WHEN a.SEX_CD = '1' AND a.LAST_GRADE = '1+' AND b.WORK_FLG = '0'
THEN b.CARCASS_PRICE * a.DEAD_WEIGHT
WHEN a.SEX_CD = '1' AND a.LAST_GRADE = '1' AND b.WORK_FLG = '1'
THEN b.CARCASS_PRICE * a.DEAD_WEIGHT
WHEN a.SEX_CD = '1' AND a.LAST_GRADE = '2' AND b.WORK_FLG = '2'
THEN b.CARCASS_PRICE * a.DEAD_WEIGHT
WHEN a.SEX_CD = '3' AND a.LAST_GRADE = '1+' AND b.WORK_FLG = '6'
THEN b.CARCASS_PRICE * a.DEAD_WEIGHT
WHEN a.SEX_CD = '3'AND a.LAST_GRADE = '1' AND b.WORK_FLG = '7'
THEN b.CARCASS_PRICE * a.DEAD_WEIGHT
WHEN a.SEX_CD = '3' AND a.LAST_GRADE = '2' AND b.WORK_FLG = '8'
THEN b.CARCASS_PRICE * a.DEAD_WEIGHT
WHEN a.SEX_CD = '2' AND a.LAST_GRADE = '등외' AND b.WORK_FLG = '9'
THEN b.CARCASS_PRICE * a.DEAD_WEIGHT
END
FROM M_GRADING_DTL A
INNER JOIN M_IV_HDR D ON D.IV_NO = A.IV_NO
LEFT JOIN M_PIG_DAILY_PRICE b ON b.WORK_DT = D.IV_DT
WHERE D.IV_DT = '20150206' AND A.BP_CD = '02-0042'
CASE 절의 조건에 따라 다른값으로 업데이트 해야될듯 한데
THEN 절이 모두 동일하고 ELSE 절이 없으므로 위의 모두 동일한 값을 반환하는
CASE 구문이구요.
업데이트할 대상인 M_GRADING_DTL_20160216 테이블이 FROM 절에 포함되지않으니..
해당 업데이트절은 처음부터 잘못되었네요. 다시 수정해보시고 다시 올려주세요~