2009-10-22 3 views
1

사용자 정의 함수가 올바르게 작동하는 데 문제가 있습니다. SQL Server 2000을 실행하고 있습니다.SQL 사용자 정의 함수 질문

"BillingTransactions"테이블에 균등 한 균형을 가진 모든 사용자의 테이블을 반환하려고합니다. 거래는 RecordType 필드에 의해 지정됩니다. 구입 0, 지불 1. 그래서 내가하려는 것은 RecordType 0이있는 각 트랜잭션의 합계가 RecordType 1이있는 각 트랜잭션의 합계와 같은 모든 사용자의 목록을 얻는 것입니다. 이제 내 함수의 내부 부분이 다음과 같이 표시됩니다.

SELECT DISTINCT UserName FROM BillingTransactions 
WHERE (SELECT SUM(AMOUNT) 
    FROM BillingTransactions 
    WHERE [BillingTransactions].[RecordType]= 0 
    AND 
    [BillingTransactions].[UserName]= UserName) 
    = 
    (SELECT SUM(AMOUNT) 
    FROM BillingTransactions 
    WHERE [BillingTransactions].[RecordType]= 1 
    AND 
    [BillingTransactions].[UserName]= UserName) 

나는 이것이 가장 효율적인 방법이 아니라고 느낍니다. 이것에 대해 어떻게 생각하는지 다른 방법이 있습니까? 감사! 대신이 같은

+0

왜 저장 프로 시저로 설정하지 않습니까? –

답변

11

는 효율의 텍스트 별만큼이나 많은 데이터의 실제 레이아웃 (테이블 구조, 인덱스 구조)에 의해 구동됩니다 쿼리. 다음은 같은 요청을 표현하지만 동일한 축약형 및 가능성있는보다 효율적인 쿼리의 버전입니다.

SELECT UserName 
FROM BillingTransactions 
GROUP BY UserName 
HAVING 0 = SUM(
    CASE RecordType 
    WHEN 1 THEN AMOUNT 
    WHEN 0 THEN -AMOUNT 
    ELSE 0 
    END); 
+0

이것은 정말 멋지다. – Manu

+0

매우 근사합니다. 감사합니다. – Kevin

+0

매우 우아한 솔루션입니다. –

3

시도 뭔가 : 모든 SQL 쿼리와 마찬가지로

select a.username 
from (select username, sum(amount) totalAmount 
    from BillingTransactions 
    where RecordType = 0 
    group by username 
    ) a 
join (select username, sum(amount) totalAmount 
    from BillingTransactions 
    where RecordType = 1 
    group by username 
    ) b on b.username = a.username and b.totalAmount = a.totalAmount 
관련 문제