0

我有一个给我带来麻烦的 SQL 查询。到目前为止,我拥有的 SQL 如下:

SELECT Dated, [Level 1 reason], SUM(Duration) AS Mins
FROM Downtime
GROUP BY Dated, [Level 1 reason]

现在我遇到的问题是结果包括多个原因,而不是按照我的要求组合在一起。问题结果的示例如下:

1/2/2013 10:02:00 AM    Westport    2
1/2/2013 10:17:00 AM    Westport    9
1/2/2013 10:48:00 AM    Engineering 5
1/2/2013 11:01:00 AM    Facilities  6

预期结果是某个日期只有一个 Westport 组。该查询还需要处理多个日期,但为了便于阅读,这些日期并未包含在代码段中。

谢谢你的帮助。我知道这是一些简单的原因,但我无法弄清楚。

**编辑:抱歉,我在 Access 中执行此操作。删除按日期分组会导致 Access 出现错误。我不确定该怎么做

“您试图执行一个不包含指定表达式 'Dated 作为聚合函数的一部分的查询。”**

D Stanley 通过以下查询解决了我的问题

SELECT DateValue(Dated) AS Dated, [Level 1 reason], SUM(Duration) AS Mins
FROM Downtime
GROUP BY DateValue(Dated), [Level 1 reason]
4

3 回答 3

2

在 Access 中,您可以使用该DateValue函数从日期列中删除时间:

SELECT DateValue(Dated) Dated, [Level 1 reason], SUM(Duration) AS Mins
FROM Downtime
GROUP BY DateValue(Dated), [Level 1 reason]
于 2013-06-24T12:56:45.343 回答
0

您似乎想删除时间组件。如何做到这一点因数据库系统而异。在 SQL Server 中,它将是:

SELECT DATEADD(day,DATEDIFF(day,0,Dated),0), [Level 1 reason],
       SUM(Duration) AS Mins
FROM Downtime
GROUP BY DATEADD(day,DATEDIFF(day,0,Dated),0), [Level 1 reason]

这是有效的,因为0可以隐式转换为日期(01/01/1900 午夜),DATEADD并且DATEDIFF仅在 datepart 的组成部分(此处为day)中有效。所以,这是“自 1900 年 1 月 1 日午夜以来已经发生了多少天?” 和“让我们在 1900 年 1 月 1 日午夜将相同的天数添加到 1900 年 1 月 1 日” - 这给了我们与我们开始时的值相同的日期,但总是在午夜。


对于 Access,我认为您必须引用日期部分(day变为"d")。我不确定0隐式转换是否仍然有效 - 但您可以将任何常量日期替换为我在0上面使用过的地方,例如:

SELECT DATEADD("d",DATEDIFF("d","01/01/1900",Dated),"01/01/1900"),
       [Level 1 reason],
       SUM(Duration) AS Mins
FROM Downtime
GROUP BY DATEADD("d",DATEDIFF("d","01/01/1900",Dated),"01/01/1900"),
         [Level 1 reason]
于 2013-06-24T12:49:16.417 回答
0

我猜在访问中它会是:

SELECT CDate(Int(Dated)) , [Level 1 reason],
   SUM(Duration) AS Mins
FROM Downtime
GROUP BY CDate(Int(Dated)) , [Level 1 reason];
于 2013-06-24T13:01:37.393 回答