2010-07-08 5 views
2

입니다. 정확한 검색 조건을 사용하고 있는지 확실하지 않습니다. 아니면 불가능할 수도 있습니다. 하지만 내가 뭘 하려는지 설정 값보다 작은 합계 값을 만드는 테이블의 모든 레코드를 업데이 트하는 것입니다.업데이트 조건에 SUM을 사용합니다. 여기서 조건은

ID type amount received_date processed_date 
1 debit 10  7/1/2010   NULL 
2 debit 10  7/2/2010   NULL 
3 debit 10  7/3/2010   NULL 

지금은 무엇을 원하는 업데이트가 나는 1과 2는 것 합 ID를 할 것 그래서 미만 (22)의 합과 같다 모든 기록입니다 : 그래서 여기

은 예입니다 20보다 작 으면 22입니다.하지만 역시 processed_date에 대해 null이있는 레코드 만 필요합니다. 또한 가장 오래된 것부터 최신의 것까지 업데이트되도록 작동하고 싶습니다.

UPDATE credits 
SET date_processed = '8/1/2010' 
WHERE SUM(amount) <= @total AND 
    credit_type = [debits] 

하지만이 작동하지 않는 것을 알고 : 기본적으로 여기

내가 의사 코드를 작성합니다 방법이다. 그래서 나는 어떤 SQL 마스터가 아이디어를 가지길 희망한다.

나는 이것을 커서 안에서 쓸 수있을 것이라고 확신하지만 이것을 수행하기위한 기반 기반 방법이 있는지 궁금합니다.

편집 : 아래 표와 간단한 설명을 업데이트하여 내 상황을 더 잘 묘사했습니다.

답변

2

행에서 찾을 수있는 좋은 튜토리얼, 항목의 정렬되지 않은 목록을 나타냅니다. 따라서 우리는 명령을 내야합니다. 귀하의 예제에서 Id에 의해 정렬 된 행을 처리해야 함을 알립니다.

Update TableName 
Set processed_date = '2010-08-01' 
Where [type] = 'debit' 
    And Exists  (
        Select 1 
        From TableName As C1 
        Where C1.Id <= TableName.Id 
         And C1.[type] = 'debit' 
        Having Sum(C1.amount) <= @total 
        ) 

의견에서 언급했듯이 Id는 시퀀스의 마커가되는 것이 안전하지 않습니다. 공백이 있고 다른 사람이 IDENTITY_INSERT를 사용하여 해당 공백에 "나중에"행을 삽입 할 수 있습니다. 대신 datetime 열을 사용해야합니다. 해당 열이 received_date 인 경우 위의 쿼리에서 을 Id으로 대체하십시오.

+0

주문 준비가되어 있으므로 걱정하지 않아도됩니다. 나는 그저 간결함을 위해 그것을 잘라 냈다.하지만 당신은 내가 알아 냈다고 생각하고 있습니다. 여기에 내가 무엇을 최대 온 것입니다 : UPDATE 크레딧 SET date_processed = '2010년 8월 1일' WHERE IN ID (크레딧 credit_type = [차변] ID BY GROUP ABS를 갖는 (SUM 이드 을 선택 (amount))) <= @ total – spinon

+0

토마스 나는 내 자신의 질문에 대해 막 대답하려고했으나 그렇게 할 때 나는 돼지처럼 느껴져서 당신이 이것을 기쁘게 생각합니다. 이제 나는해야만합니다. – spinon

+0

실제로 레코드별로 그룹화했기 때문에 실제로 정확하지 않은 ID로 그룹화했기 때문에 실제로 더 나았습니다. 너는 그룹화를 올바르게 할 것이다. – spinon

1

이러한 상황에서는 HAVING 절을 사용해야합니다.

w3schools에 따르면 "WHERE 키워드를 집계 함수와 함께 사용할 수 없으므로 HAVING 절이 SQL에 추가되었습니다." 여기

UPDATE credits 
SET date_processed = '8/1/2010' 
WHERE credit_type = [debits] 
HAVING SUM(amount) <= @total 

는 SQL 테이블에 W3 스쿨

http://www.w3schools.com/SQL/sql_having.asp

+0

감사합니다. 나는 데 대해 확신하지 못했습니다. – spinon

+0

내가 이것을 시도 할 때 근처에 잘못된 구문이 표시됩니까? 어떤 아이디어? 나는 나 자신도 좀더 보일 것이다. – spinon

+1

좋아, 이러지 마라. HAVING은 SELECT 문과 함께 만 사용할 수 있습니다. 바로 MSDN 설명서에서 나와 있습니다. – spinon