1

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

ID    SourceID     Personal_ID     Name     NumberOfPurchases 
1      4            1001           Alex           10
2      2            1002           Sara            5
3      4            1001           Alex            12
4      1            1003           Mina            200
5      2            1002           Sara            20  
6      2            1001           Alex            64

现在需要做的是根据给定的 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)

但这显然是错误的。我被困在这里,如果我将其他字段添加到结果中group-by clause,结果将完全不同,如果我不这样做,则此选择命令将不起作用。我怎样才能达到这样的结果?

4

3 回答 3

1

像这样的东西?

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

注意:分组WHERE的过滤器和分组的过滤器。HAVING

于 2013-02-19T11:04:24.193 回答
1

我猜这里的问题是你NameSELECT子句中有,但你在Personal_ID. 如果您也Name明确地添加到您的GROUP BY子句中,它可能会有所帮助。如果一切顺利,Name将在功能上由Personal_ID无论如何决定。

而且您还应该像Lucero 所说WHERE的那样,在子句中将过滤器放在 SourceID 上。所以你的查询应该是这样的:

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

看看这个小提琴

澄清一下:如果你使用聚合函数SUM(),你的子句中的所有其他东西SELECT也应该在你的GROUP BY子句中。但是您不想仅在 上进行分组Name,因为在您的情况下它不是唯一的。这就是为什么你在你的条款中同时拥有Personal_ID and的原因。 当. _ 并且您正在添加以确保并非所有 Sara 都放在一个大 Sara 组中,而是根据.NameGROUP BYNameGROUP BYPersonal_IDPersonal_ID

于 2013-02-19T11:10:57.043 回答
1

你可以试试这个:

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

这是一个SQL 小提琴

在测试数据中,我添加了另一条包含名为“Alex”的人的记录,现在有两个同名的人,这表明无法使用Name列进行分组,因为它不是唯一的。我还添加Personal_ID了选择列表,以便可以区分同名的人。

于 2013-02-19T11:11:20.867 回答