IT Share you

조건이있는 SQL 합계

shareyou 2020. 12. 11. 20:54
반응형

조건이있는 SQL 합계


현재 각 트랜잭션 ID (고유 한)에 대한 총 현금을 얻기 위해 다음 줄을 추가하는 큰 SQL 문이 있습니다.

select sum(cash) from Table a where a.branch = p.branch 
and a.transID = p.transID) TotalCash

그리고 나는 이제 똑같이해야하지만 지난달에 valuedate가있는 현금 가치 만 합산해야하므로 다음과 같은 것이 있습니다.

select sum(CASE ValueDate WHEN > @startMonthDate THEN cash ELSE NULL END) 
from Table a where a.branch = p.branch and a.transID = p.transID) TotalMonthCash

전체 설명이 없어서 미안하지만 저장 프로 시저의 컨텍스트에 따라 정말 길고 구체적이지만 누군가가 내가 의미하는 바를 알기를 바랐습니까?


대신 이것을 시도하십시오.

SUM(CASE WHEN ValueDate > @startMonthDate THEN cash ELSE 0 END)

설명

CASE 표현식에 잘못된 구문이 있습니다. 간단한 CASE 표현식 구문과 검색된 CASE 표현식 구문을 혼동하고있는 것 같습니다. CASE에 대한 문서를 참조하십시오 .

CASE 표현식에는 두 가지 형식이 있습니다.

  • 단순 CASE 식은 식을 단순 식 집합과 비교하여 결과를 결정합니다.
  • 검색된 CASE 표현식은 결과를 결정하기 위해 부울 표현식 세트를 평가합니다.

검색된 CASE 표현식 구문이 필요합니다.

CASE
     WHEN Boolean_expression THEN result_expression [ ...n ] 
     [ ELSE else_result_expression ] 
END

참고로 성능이 문제인 경우 종속 하위 쿼리를 사용하는 대신 JOIN 및 GROUP BY를 사용하여 다시 작성하면이식이 더 빨리 실행된다는 것을 알 수 있습니다.


이동 시도 ValueDate:

select sum(CASE  
             WHEN ValueDate > @startMonthDate THEN cash 
              ELSE 0 
           END) 
 from Table a
where a.branch = p.branch 
  and a.transID = p.transID

(명확성을 위해 형식이 변경됨)

합계를 수행 할 때 NULL 대신 '0'을 사용하는 것을 고려할 수도 있습니다. 두 가지 방식 모두 올바르게 작동하지만 의도가 무엇인지 더 잘 나타낼 수 있습니다.


조건 HAVING을 사용하면 원하는 경우 ultrapass 0이 아닌 현금으로 데이터를 제거하여 쿼리의 효율성을 높일 수 있습니다.

SELECT SUM(cash) AS money FROM Table t1, Table2 t2 WHERE t1.branch = t2.branch 
AND t1.transID = t2.transID
AND ValueDate > @startMonthDate HAVING money > 0;

참고 URL : https://stackoverflow.com/questions/4517681/sql-sum-with-condition

반응형