Sql server 如何对字段进行SQL求和,并按节分组使用不同的字段?
我有一个这样的表:(请注意,名称不是唯一的,可以重复,而Personal_ID是唯一的) 现在需要做的是根据给定的SourceID获得每个人的购买总数。因此我们得到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
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相连,因此它很简单,并且可以按预期工作。