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我想要的只是一个数字的列表。即所有持有值的总和。为什么不将它们全部组合在一起形成一个总数?

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 子句,它可以分别为您提供每个组的总数。

如果您需要过滤数据,请将条件放入 Where 子句中

于 2013-04-22T13:35:27.953 回答
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 回答