【问题标题】:DSum with Date criteria and GROUP BY带有日期条件和 GROUP BY 的 Dsum
【发布时间】:2013-12-02 20:47:01
【问题描述】:

我想编写一个访问查询(我认为 SQL 最合适),以便为每个产品检索单个数字或数字总和(如果这些数字绑定到相似日期)。

我的表格如下所示:

Tck1    DeD1    Bdf1
Tck1    DeD2    Bdf2
Tck1    DeD3    Bdf3
Tck2    DeD1    Bdf1
Tck2    DeD1    Bdf2
Tck2    DeD1    Bdf3
Tck2    DeD2    Bdf4
Tck3    DeD1    Bdf1
Tck3    DeD2    Bdf2

如您所见,对于 Tck1 和 Tck2,我只需要检索 Bdf1,但对于 Tck2,我需要对 Bdf1、Bdf2 和 Bdf3 求和

我尝试过(不成功)一些说法:

SELECT Sum([tblB].Bdf) As SumOfBdf
FROM [tblB]
GROUP BY Tck
HAVING (DeD = Min(Ded));

还有:

SELECT Sum([tblB].Bdf) As Expr1
FROM [tblB]
GROUP BY Tck
HAVING (DeD = Min(Ded));

知道我应该改变什么来提取数据吗?谢谢

感谢所有看过它的人,尤其是 Gord。

以下是一句话的答案:

SELECT tblB.Tck, tblB.DeD, Sum(tblB.Bdf) AS SumOfBdf
FROM tblB
GROUP BY tblB.Tck, tblB.DeD
HAVING (((tblB.DeD) In (SELECT Min(tblB.DeD) AS MinOfDeD FROM tblB GROUP BY tblB.Tck;)));

【问题讨论】:

  • 您应该将表结构添加到问题中。而且我不明白你说的部分:“或数字的总和,如果这些数字绑定到相似的日期。” - 您是否希望在同一查询中将此作为每个产品的数字总和?在不同的查询中,这很简单。
  • +1 来自@FilipeSilva 的评论 - 此外,一些具有代表性的样本数据和所需结果的示例总是有帮助的。

标签: sql ms-access select group-by sum


【解决方案1】:

假设您的数据如下所示:

ID  Tck   DeD         Bdf
--  ----  ----------  ---
 1  Tck1  2013-01-01  100
 2  Tck1  2013-01-02  101
 3  Tck1  2013-01-03  102
 4  Tck2  2013-02-01  201
 5  Tck2  2013-02-01  202
 6  Tck2  2013-02-01  203
 7  Tck2  2013-02-02  204
 8  Tck3  2013-03-01  301
 9  Tck3  2013-03-02  302

那么返回每个 [Tck] 最早日期的查询将是

SELECT Tck, Min(DeD) AS MinOfDeD FROM tblB GROUP BY Tck

这给了我们

Tck   MinOfDeD  
----  ----------
Tck1  2013-01-01
Tck2  2013-02-01
Tck3  2013-03-01

下一步是使用该查询作为子查询来隔离属于这些日期的行

SELECT tblB.Tck, tblB.DeD, tblB.Bdf
FROM
    tblB
    INNER JOIN
    (
        SELECT Tck, Min(DeD) AS MinOfDeD FROM tblB GROUP BY Tck
    ) AS minDates
        ON tblB.Tck = minDates.Tck AND tblB.DeD = minDates.MinOfDeD

返回

Tck   DeD         Bdf
----  ----------  ---
Tck1  2013-01-01  100
Tck2  2013-02-01  201
Tck2  2013-02-01  202
Tck2  2013-02-01  203
Tck3  2013-03-01  301

最后,我们可以将其包装在一个聚合查询中,以提供总和

SELECT Tck, DeD, Sum(Bdf) AS SumOfBdf
FROM
    (
        SELECT tblB.Tck, tblB.DeD, tblB.Bdf
        FROM
            tblB
            INNER JOIN
            (
                SELECT Tck, Min(DeD) AS MinOfDeD FROM tblB GROUP BY Tck
            ) AS minDates
                ON tblB.Tck = minDates.Tck AND tblB.DeD = minDates.MinOfDeD
    )
GROUP BY Tck, DeD

返回

Tck   DeD         SumOfBdf
----  ----------  --------
Tck1  2013-01-01       100
Tck2  2013-02-01       606
Tck3  2013-03-01       301

编辑回复:评论

如果我们稍微调整一下测试数据:

ID  Tck   DeD         Bdf
--  ----  ----------  ---
 1  Tck1  2013-01-01  100
 2  Tck1  2013-01-02  101
 3  Tck1  2013-01-03  102
 4  Tck2  2013-01-02  201

然后是您评论中的查询(和更新的问题)

SELECT tblB.Tck, tblB.DeD, Sum(tblB.Bdf) AS SumOfBdf 
FROM tblB 
GROUP BY tblB.Tck, tblB.DeD 
HAVING (((tblB.DeD) In (SELECT Min(tblB.DeD) AS MinOfDeD FROM tblB GROUP BY tblB.Tck;)));

为“Tck1”返回两行

Tck   DeD         SumOfBdf
----  ----------  --------
Tck1  2013-01-01       100
Tck1  2013-01-02       101
Tck2  2013-01-02       201

因为 HAVING 子句不区分 [Tck] 的 Min(dates)

我在此编辑上方的答案中的最后一个查询(确实在“一个查询”中提供了解决方案,尽管它使用了几个子查询),返回

Tck   DeD         SumOfBdf
----  ----------  --------
Tck1  2013-01-01       100
Tck2  2013-01-02       201

【讨论】:

  • 感谢 Gord,这就是我一直在寻找的东西,我希望通过一个单一的语句来完成它......如下:SELECT tblB.Tck, tblB.DeD, Sum(tblB. Bdf) AS SumOfBdf FROM tblB GROUP BY tblB.Tck, tblB.DeD HAVING (((tblB.DeD) In (SELECT Min(tblB.DeD) AS MinOfDeD 从 tblB GROUP BY tblB.Tck;)));
  • @ProtoVB 我不确定您的查询是否会始终返回您想要的内容。我已经更新了我的答案来说明。
  • 感谢 Gord 突出显示此元素。我会进行一些测试
猜你喜欢
  • 1970-01-01
  • 2013-08-15
  • 2021-06-06
  • 1970-01-01
  • 1970-01-01
  • 2012-10-07
  • 1970-01-01
  • 2016-03-13
  • 1970-01-01
相关资源
最近更新 更多