2012-12-05 2 views
1

나는 groupid의, masteraccountnames 및 CashAmountDiff의 목록을 반환하려고하는데, 같은 groupid를 가진 거래의 CashAmount 합계가 모든 날짜에 대해 100보다 큰 경우. 사례와 하위 그룹 집계

테이블 스키마

그렇게 같다 :

TradeT1

TradeId | SubAccountId | MasterAccId | GroupId | TradeDate | TradeType 

MasterAccount

Id | MasterAccName 

하위 계정

Id | SubAccName | MasterAccountId 

각 SubAccount는 MasterAccount에 연결됩니다. 그것은 다 대일 관계입니다.

TradeType은 직불 카드이든 신용 카드이든 거래의 '방향'을 결정합니다. groupid 당 빚과 크레딧을 추가하는 데 문제가 있습니다. 내 쿼리는 모든 것을 합산하는 것입니다. CashAmount를 사용하는 경우 (CashAmount * -1 곱하기) 사례를 통합하는 방법을 잘 모르겠습니다.

단일 groupid에 항상 두 개 이상의 tradeid가 연결됩니다.

나는 나의 노력과 함께 여기에 SQL 바이올린의 테이블이 있습니다 http://www.sqlfiddle.com/#!3/45580/1/0

SELECT 
t.groupId, 
ma.MasterAccName, 
sum(CASE WHEN t.tradetype = 'Credit' 
     THEN sum(-1*t.cashamount) 
    ELSE sum(t.cashamount)) 
END as CashDiff 
FROM tradet1 t 
JOIN masteraccount ma 
ON t.masteraccid = ma.id 
WHERE t.groupid > -1 
GROUP BY t.groupid, ma.MasterAccName 
HAVING count(t.groupid) > 1 and sum(t.cashamount) > 100 

감사 어떤 도움.

+0

없음 CashAmount과 같을 것이다 또는 CashAmountDiff 열이 – Paparazzi

+0

코드를 업데이트하지만 컴파일 정의되지 않았습니다. http://www.sqlfiddle.com/#!3/45580/9 – user1773949

답변

1

당신은 하위 쿼리에서 크레딧 및 직불 결제를 변환하여 집계 쿼리에 그 결과를 사용하여이 쿼리를 상당히 단순화 할 수 있습니다.

는이와

SELECT [tt].[GroupId] , 
      [ma].[MasterAccName] , 
      CASE WHEN [tt].[TradeType] = 'Credit' 
       THEN [tt].[CashAmount] * -1 
       ELSE [tt].[CashAmount] 
       END AS CashAmount 
FROM  [dbo].[TradeT1] AS tt 
      JOIN [dbo].[MasterAccount] AS ma ON [tt].[MasterAccId] = [ma].[Id] 

, 당신은 주변 집계 쿼리에 사용하는 등의 긍정적이고 부정적인 CashAmounts의 좋은 목록을 가지고있다.

전체 쿼리는이

SELECT [tn].[GroupId] , 
     [tn].[MasterAccName] , 
     SUM([tn].[CashAmount]) AS CashDiff 
FROM (SELECT [tt].[GroupId] , 
        [ma].[MasterAccName] , 
        CASE WHEN [tt].[TradeType] = 'Credit' 
         THEN [tt].[CashAmount] * -1 
         ELSE [tt].[CashAmount] 
        END AS CashAmount 
      FROM  [dbo].[TradeT1] AS tt 
        JOIN [dbo].[MasterAccount] AS ma ON [tt].[MasterAccId] = [ma].[Id] 
     ) AS tn 
GROUP BY [tn].[GroupId] , 
     [tn].[MasterAccName] 
HAVING ABS(SUM([tn].[CashAmount])) > 100 AND COUNT([tn].[GroupId]) > 1 
+0

켄. 동일한 결과. 이것은 꽤 우아합니다. – user1773949

1

이것은 +/-에 맞게 조정 된 쿼리입니다. 내가 흔적을 가지고 있을지도 모른다.

Select 
    t.groupId, 
    ma.MasterAccName, 
    Sum (Case When TradeType = 'Credit' Then -t.cashamount Else t.cashamount End) AS 'CashDiff' 
From 
    tradet1 t 
     Inner Join 
    masteraccount ma 
     On t.masteraccid = ma.id 
Where 
    t.groupid > -1 
Group By 
    t.groupid, 
    ma.MasterAccName 
Having 
    Count(t.groupid) > 1 And 
    Sum (Case When TradeType = 'Credit' Then -t.cashamount Else t.cashamount End) > 100 

http://www.sqlfiddle.com/#!3/45580/20

+0

귀하의 질의가 groupid 8888에 누락되었습니다. 여기에 대한 대답이있을 수 있습니다. http://www.sqlfiddle.com/#!3/886c7/4/0 – user1773949

+0

내가 연결된 피들은 표지판을 거꾸로 가지고 있습니다. 합계가 100보다 크다고 말할 때 당신이 원하는 것에 대해 더 명확히해야합니다. 그 금액은 빚을 갚고 신용을 마이너스로 뺀 것입니까? – Laurence

+0

예, 플러스 및 크레딧으로 마이너스로 청구하고 절대적으로 명확합니다 (100보다 크거나 -100보다 작음 - CashDiff의 절대 값) 실제로 내 피들은 여전히 ​​올바르지 않습니다. CashDiff에서 반환 된 집계 수치가 잘못되었습니다. http://www.sqlfiddle.com/#!3/2bfea/4 – user1773949