SQL 到 GROUP BY 计算日期

Posted

技术标签:

【中文标题】SQL 到 GROUP BY 计算日期【英文标题】:SQL to GROUP BY calculated date 【发布时间】:2016-03-03 11:35:39 【问题描述】:

在通过 SQL 按日期对数据进行分组时,我需要一些帮助,但似乎遇到了错误。

这是我当前的 SQL 语句,用作传递给 Excel VBA 宏的变量。

SQLtext = "SELECT [Offered], [MidnightStartDate], tblConfig_Queue.[Name], tblConfig_Queue.[Reporting]" & _
"FROM tblData_QueuePerformanceByPeriod INNER JOIN tblConfig_Queue on tblConfig_Queue.Pkey = tblData_QueuePerformanceByPeriod.FKQueue " & _
"Where [Offered]>0 AND[MidnightStartDate]>" & MakeUSSQLDate(Sheet13.Range("A1").Value) & " AND [MidnightStartDate]<" & MakeUSSQLDate(Sheet13.Range("A2").Value + 1) & _
""

字段 MidnightStartDate 是美国格式的日期和时间字段。 MakeUSSQLDate 过程将其转换为英国格式。然后,我想从该字段中删除任何时间值,并且只有日期,并按此字段分组,以便为​​每个日期的每个 [Name] 和 [Reporting] 值提供 [Offered] 总数。我已经使用 convert 函数去除了时间,目前它的工作原理如下。

SQLtext = "SELECT [Offered], convert(varchar, [MidnightStartDate], 103) AS [Date2], tblConfig_Queue.[Name], tblConfig_Queue.[Reporting]" & _
"FROM tblData_QueuePerformanceByPeriod INNER JOIN tblConfig_Queue on tblConfig_Queue.Pkey = tblData_QueuePerformanceByPeriod.FKQueue " & _
"Where [Offered]>0 AND[MidnightStartDate]>" & MakeUSSQLDate(Sheet13.Range("A1").Value) & " AND [MidnightStartDate]<" & MakeUSSQLDate(Sheet13.Range("A2").Value + 1) & _
""

但是我似乎无法按日期分组。我已将GROUP BY CONVERT(varchar, [MidnightStartDate], 103) ORDER BY CONVERT(varchar, [MidnightStartDate], 103) 添加到 SQL 语句的末尾以尝试解决此问题,但只会返回错误消息。

【问题讨论】:

你能发布错误吗? 你得到什么错误? 我收到以下错误:[Microsoft][ODBC SQL Server Driver][SQL Server]Column 'tblData_QueuePerformanceByPeriod.Offered' 在选择列表中无效,因为它不包含在聚合函数或GROUP BY 子句。 我现在已经在我的 GROUP BY 中包含了 tblConfig_Queue.[Name], tblConfig_Queue.[Reporting],但是 [Offered] 的总数似乎不正确。 谢谢大家 - 现在一切正常。当我将 SELECT [Offered] 更改为 SELECT SUM([Offered]) 时,总数似乎是正确的。我还从 GROUP BY 语句中删除了 [Offered],因为它会导致错误。 【参考方案1】:

我正在等待您的错误,但是...

如果您使用 GROUP BY 如下:

convert(varchar, [MidnightStartDate], 103)

您在 SELECT 字段中有这些字段:

[Offered], convert(varchar, [MidnightStartDate], 103),
tblConfig_Queue.[Name], tblConfig_Queue.[Reporting]

这是逻辑错误,因为您必须在 group by 子句中添加所有字段。

当您在 SELECTE 字段列表中使用 GROUP BY 时,您只能:

常量 分组字段 聚合函数

所以你必须像下面这样扩展你的 GROUP BY 子句:

GROUP BY [Offered], convert(varchar, [MidnightStartDate], 103) AS [Date2],
tblConfig_Queue.[Name], tblConfig_Queue.[Reporting]

【讨论】:

【参考方案2】:

假设您的错误与不包括其他字段或将它们包装在聚合函数中有关:

SQLtext = "SELECT [Offered], convert(varchar, [MidnightStartDate], 103) AS [Date2], tblConfig_Queue.[Name], tblConfig_Queue.[Reporting]" & _
"FROM tblData_QueuePerformanceByPeriod INNER JOIN tblConfig_Queue ON tblConfig_Queue.Pkey = tblData_QueuePerformanceByPeriod.FKQueue " & _
"WHERE [Offered]>0 AND [MidnightStartDate]>" & MakeUSSQLDate(Sheet13.Range("A1").Value) & " AND [MidnightStartDate]<" & MakeUSSQLDate(Sheet13.Range("A2").Value + 1) & _
"GROUP BY convert(varchar, [MidnightStartDate], 103), [Offered], tblConfig_Queue.[Name], tblConfig_Queue.[Reporting]" & _
"ORDER BY convert(varchar, [MidnightStartDate], 103)" & _
""

BETWEEN清理

SQLtext = "SELECT [Offered], convert(varchar, [MidnightStartDate], 103) AS [Date2], tblConfig_Queue.[Name], tblConfig_Queue.[Reporting]" & _
"FROM tblData_QueuePerformanceByPeriod INNER JOIN tblConfig_Queue ON tblConfig_Queue.Pkey = tblData_QueuePerformanceByPeriod.FKQueue " & _
"WHERE [Offered]>0 AND [MidnightStartDate] BETWEEN" & MakeUSSQLDate(Sheet13.Range("A1").Value) & " AND " & MakeUSSQLDate(Sheet13.Range("A2").Value + 1) & _
"GROUP BY convert(varchar, [MidnightStartDate], 103), [Offered], tblConfig_Queue.[Name], tblConfig_Queue.[Reporting]" & _
"ORDER BY convert(varchar, [MidnightStartDate], 103)" & _
""

【讨论】:

【参考方案3】:

感谢您的帮助 - 我的最终工作代码

SQLtext = "SELECT SUM([Offered]), CAST([MidnightStartDate] AS INT), tblConfig_Queue.[Name], tblConfig_Queue.[Reporting]" & _
"FROM tblData_QueuePerformanceByPeriod INNER JOIN tblConfig_Queue on tblConfig_Queue.Pkey = tblData_QueuePerformanceByPeriod.FKQueue " & _
"Where [Offered]>0 AND[MidnightStartDate]>" & MakeUSSQLDate(Sheet13.Range("A1").Value) & " AND [MidnightStartDate]<" & MakeUSSQLDate(Sheet13.Range("A2").Value + 1) & _
"GROUP BY CAST([MidnightStartDate] AS INT), tblConfig_Queue.[Name], tblConfig_Queue.[Reporting]" & _
"ORDER BY CAST([MidnightStartDate] AS INT), tblConfig_Queue.[Reporting];"

【讨论】:

以上是关于SQL 到 GROUP BY 计算日期的主要内容,如果未能解决你的问题,请参考以下文章

SQL GROUP BY子句,使用AVG在DATESPAN计算中获得浮点数2精度

GROUP BY TRUNC 的链(日期)

SQL Group By 每个日期的总和并使用最大日期

MySQL 5.1上没有泄漏SQL的GROUP BY日期[重复]

sql分别用日期月年 分组 group by 分组,datepart函数

具有日期范围条件的 Group By 和 SUM 的 sql