【问题标题】:SQL to GROUP BY calculated dateSQL 到 GROUP BY 计算日期
【发布时间】: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],因为它会导致错误。

标签: sql-server excel vba ms-access group-by


【解决方案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];"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-26
        • 2021-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-15
        相关资源
        最近更新 更多