2013-04-22 49 views
1

所以我有3个表连接,如下所示:总和SQL语句输出多行的时候我希望只有一个

enter image description here

我想要做的是所有持有的是落入总和查询在我的查询中为客户指定的条件。以下是我有:

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

+0

添加以下SELECT语句:Holdings.HoldingDate,Clients.Active,Clients.RiskCode,Clients.NewClient,Clients.BaseCurrency,Clients.ClientID – wcm 2013-04-22 13:36:36

+0

鉴于你是'GROUP',你可以在'SELECT'列表中包含这些'GROUP'列,而不会影响整个查询。然后您会看到不同的行对“RiskCode”和/或“ClientID”具有不同的值。 – 2013-04-22 13:37:30

+0

好的,这是因为'ClientID'和'RiskCode'具有不同的值。即使它们不同,我怎样才能将所有事物分组? – harryg 2013-04-22 13:40:33

回答

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(在整个集合上)并产生单个行。

+0

完美。知道我在做一些愚蠢的事情。谢谢 – harryg 2013-04-22 13:46:08

2

如果你只是想总计 - 删除组。使用group by子句,它会分别给出每个组的总数。

如果您需要过滤的数据把条件为Where子句,而不是

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))); 
+0

谢谢,这也是答案,但我只能接受一个 – harryg 2013-04-22 13:46:41

+0

@harryg。 。 。没问题。不止一个人为一个问题得出正确答案并不罕见。 – 2013-04-22 13:59:27

相关问题