我有一个导致我麻烦的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出错。我不确定该怎么做
“您尝试执行不包含指定的查询 表达式'作为聚合函数的一部分。“**
D Stanley用以下查询解决了我的问题
SELECT DateValue(Dated) AS Dated, [Level 1 reason], SUM(Duration) AS Mins
FROM Downtime
GROUP BY DateValue(Dated), [Level 1 reason]
答案 0 :(得分:2)
在Access中,您可以使用DateValue
功能从日期列中删除时间:
SELECT DateValue(Dated) Dated, [Level 1 reason], SUM(Duration) AS Mins
FROM Downtime
GROUP BY DateValue(Dated), [Level 1 reason]
答案 1 :(得分: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
)。那么,这是“自从01/01/1900午夜以来发生了多少天?”并且“让我们在午夜01/01/1900添加相同的天数” - 这给我们的日期与我们开始时的价值相同,但总是在午夜。
对于Access,我认为您必须引用datepart(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]
答案 2 :(得分:0)
我想访问它会是:
SELECT CDate(Int(Dated)) , [Level 1 reason],
SUM(Duration) AS Mins
FROM Downtime
GROUP BY CDate(Int(Dated)) , [Level 1 reason];