Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何对字段进行SQL求和,并按节分组使用不同的字段?_Sql Server_Select_Group By_Aggregate Functions_Having Clause - Fatal编程技术网

Sql server 如何对字段进行SQL求和,并按节分组使用不同的字段?

Sql server 如何对字段进行SQL求和,并按节分组使用不同的字段?,sql-server,select,group-by,aggregate-functions,having-clause,Sql Server,Select,Group By,Aggregate Functions,Having Clause,我有一个这样的表:(请注意,名称不是唯一的,可以重复,而Personal_ID是唯一的) 现在需要做的是根据给定的SourceID获得每个人的购买总数。因此我们得到sourceId=4的结果如下: Name Total Number of Purchases 1. Alex 22 而对于SourceID=2 Name Total Number of Purchases 1. Alex

我有一个这样的表:(请注意,名称不是唯一的,可以重复,而Personal_ID是唯一的)

现在需要做的是根据给定的SourceID获得每个人的购买总数。因此我们得到
sourceId=4
的结果如下:

        Name        Total Number of Purchases
 1.     Alex                 22
而对于SourceID=2

        Name        Total Number of Purchases
1.      Alex                 64
2.      Sara                 25
为此,我提出了如下建议:

SELECT Name,Sum(NumberOfPurchases) AS Total
FROM    tblTEST
GROUP BY (Personal_ID)
HAVING (SOURCEID = @id)
SELECT   Name
         ,Sum(NumberOfPurchases) AS Total
FROM     tblTEST
WHERE    SOURCEID = @id
GROUP BY Personal_ID, Name;
但这显然是错误的。我被困在这里,如果我在
group by子句中添加其他字段,结果将完全不同,如果我不这样做,这个select命令将不起作用。我怎样才能达到这样的结果呢?

像这样的事情

SELECT Name, SUM(NumberOfPurchases) AS Total
FROM tblTEST
WHERE (SourceID = @id)
GROUP BY Name

注意:
WHERE
在分组前进行筛选,而
在分组后进行筛选。

我想这里的问题是,您的
SELECT
子句中有
Name
,但您是在
个人ID
上进行分组的。如果将
Name
明确地添加到
groupby
子句中,可能会有所帮助。如果一切正常,
名称
在功能上将由
个人ID
决定

您还应该在
WHERE
子句中的SourceID上放置过滤器,如。因此,您的查询应该如下所示:

SELECT Name,Sum(NumberOfPurchases) AS Total
FROM    tblTEST
GROUP BY (Personal_ID)
HAVING (SOURCEID = @id)
SELECT   Name
         ,Sum(NumberOfPurchases) AS Total
FROM     tblTEST
WHERE    SOURCEID = @id
GROUP BY Personal_ID, Name;
看看这个

要澄清问题:如果您使用聚合函数,如
SUM()
,则
SELECT
子句中的所有其他内容也应位于
GROUP BY
子句中。但您不希望仅在
名称上分组,因为它在您的案例中不是唯一的。这就是为什么在
分组依据
子句中既有
个人ID
又有
姓名
。当
分组依据
中缺少
名称
时,将不执行查询。您正在添加
Personal\u ID
,以确保并非所有Sara都放在一个大的Sara组中,而是根据
Personal\u ID
进行分组。您可以尝试以下方法:

SELECT  names.Name
        , names.Personal_ID
        , grouped.Total
FROM    (
            SELECT  SourceID
                    , Personal_ID
                    , SUM(NumberOfPurchases) AS Total
            FROM    tblTEST
            GROUP BY 
                    SourceID, Personal_ID
) grouped
JOIN    (

        SELECT  DISTINCT
                Personal_ID
                , Name
        FROM    tblTEST
) names ON      names.Personal_ID = grouped.Personal_ID
WHERE           SourceID = @id
这是一个


在测试数据中,我添加了另一个包含名为“Alex”的人的记录,现在有两个同名的人,这表明不能使用
name
列进行分组,因为它不是唯一的。我还在选择列表中添加了
Personal\u ID
,这样可以区分同名的人。

非常感谢,但姓名不是唯一的,所以可以重复,这样查询就不会给出预期的结果
HAVING
仅将聚合函数调用的结果与某个值()进行比较。这不会编译。@Hossein:但是个人ID和名字的组合是唯一的,对吗?或者你想让Alex组中的Alexes和Sara组中的Sara不同???@IvanG:你说得对,相应地改变了。首先,我只是查看了
groupby
子句中缺少的
Name
。谢谢Josien:)是的,这种组合也是唯一且可行的。谢谢你,但姓名不是唯一的,这就是为什么我使用个人ID让每个人购买的物品都是唯一的
Name
列不适合分组,姓名不是唯一的。如果您有另一个名为“Alex”的用户具有不同的
个人\u ID
,尽管有两个不同的人,但他们的所有购买都将汇总在一起。@IvanG,虽然您的论点是正确的,但我遵循了OP在原始查询中选择的列。由于从未选择过ID,因此同时使用这两个ID的
GROUP BY
将产生多个名称相同(不可区分)的行,并产生大量购买,这也是毫无意义的。我的答案是关于过滤方面的:非常感谢,这非常好,我对选择哪一个作为答案持怀疑态度,因为Josiens的解决方案更简单,所以我选择了那个。我也喜欢你的SQL Fiddle链接,它很棒。总之,我只想向你表示我对你的帮助的深切感谢;)再次感谢:)不客气:)Josien的解决方案是好的和高效的,因为它是按
Personal\u ID
Name
分组的。只有一个名字与一个人的ID相连,因此它很简单,并且可以按预期工作。