1

groupid、masteraccountnames、CashAmountDiffのリストを返そうとしています。ここで、同じgroupidを持つ取引のCashAmountの合計は、どの日付でも100を超えています。

テーブルスキーマは次のようになります。

TradeT1

TradeId | SubAccountId | MasterAccId | GroupId | TradeDate | TradeType 

MasterAccount

Id | MasterAccName 

サブアカウント

Id | SubAccName | MasterAccountId 

各サブアカウントはマスターアカウントにリンクされています。それは多対一の関係です。

TradeTypeは、借方か貸方かに関係なく、取引の「方向」を決定します。groupidごとに借方と貸方を追加するのに問題があります。私のクエリはすべてを合計しているだけです。クレジットの場合(CashAmount * -1を掛ける)、デビットの場合はCashAmountを使用する方法がわかりません

1つのグループIDにリンクされた複数のトレードIDが常に存在します。

私の努力とともに、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

助けていただければ幸いです。

4

2 に答える 2

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

于 2012-12-05T23:52:33.850 に答える
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
于 2012-12-06T00:35:58.937 に答える