1

したがって、次のように3つのテーブルが結合されています。

ここに画像の説明を入力

私がやりたいことは、クエリでクライアントに指定された基準に該当するすべての保有の合計をクエリすることです。ここに私が持っているものがあります:

SELECT Sum(Holdings.HoldingValue) AS SumOfHoldingValue
FROM (Clients INNER JOIN Accounts 
    ON Clients.ClientID = Accounts.ClientID) 
    INNER JOIN Holdings 
    ON Accounts.AccountID = Holdings.AccNum
GROUP BY Holdings.HoldingDate, Clients.Active, Clients.RiskCode, Clients.NewClient, Clients.BaseCurrency, Clients.ClientID
HAVING (((Holdings.HoldingDate)=#3/31/2013#) 
    AND ((Clients.Active)=True) 
    AND ((Clients.RiskCode) In (1,2)) 
    AND ((Clients.NewClient)=True) 
    AND ((Clients.BaseCurrency)='GBP') 
    AND ((Clients.ClientID) Not In (10022,10082,10083)));

結果として得られるものの例を次に示します。

SumOfHoldingValue
1056071.96
466595.6
1074459.38
371142.54
814874.42
458203.65
8308697.09
254733.94
583796.33
443897.76
203787.11
1057445.84
1058751.26
317507.43

したがって、クライアント テーブルにはかなりの数の基準がありますが、結果は、SumOfHoldingValue必要な数値が 1 つだけの場合のリストになります。つまり、すべての保持値の合計です。それらすべてをグループ化して 1 つの合計を形成しないのはなぜですか?

4

3 に答える 3

3

句の値の集計を計算していないので、これが必要だHAVINGと思います:

SELECT Sum(Holdings.HoldingValue) AS SumOfHoldingValue
FROM (Clients INNER JOIN Accounts 
    ON Clients.ClientID = Accounts.ClientID) 
    INNER JOIN Holdings 
    ON Accounts.AccountID = Holdings.AccNum
WHERE (((Holdings.HoldingDate)=#3/31/2013#) 
    AND ((Clients.Active)=True) 
    AND ((Clients.RiskCode) In (1,2)) 
    AND ((Clients.NewClient)=True) 
    AND ((Clients.BaseCurrency)='GBP') 
    AND ((Clients.ClientID) Not In (10022,10082,10083)));

これは、GROUP句なしで(セット全体で)単一を生成し、単一の行を生成します GROUP

于 2013-04-22T13:39:14.287 に答える
2

クエリには、group by各グループをそれぞれの行に返す句が含まれています。

having句も使用しています。having節はのに適用されgroup byます。通常、 などの集計関数が含まれhaving count(*) > 1ます。あなたの場合、それはwhere句として使用されます。

次のようにクエリを書き直してみてください。

SELECT Sum(Holdings.HoldingValue) AS SumOfHoldingValue
FROM (Clients INNER JOIN Accounts 
    ON Clients.ClientID = Accounts.ClientID) 
    INNER JOIN Holdings 
    ON Accounts.AccountID = Holdings.AccNum
WHERE (((Holdings.HoldingDate)=#3/31/2013#) 
    AND ((Clients.Active)=True) 
    AND ((Clients.RiskCode) In (1,2)) 
    AND ((Clients.NewClient)=True) 
    AND ((Clients.BaseCurrency)='GBP') 
    AND ((Clients.ClientID) Not In (10022,10082,10083)));
于 2013-04-22T13:39:56.847 に答える