SELECT语句以查找列的SUM

时间:2019-08-18 02:14:04

标签: sql sql-server

我正在尝试创建一个查询语句,该语句将找到TaskLength列的总和。

我尝试了很多数字组合,使用逗号分隔符和SUM语句在查询中放置SQL AND函数。如果没有SUM TaskLength,则查询工作正常。

这在c# WPF应用程序中使用,但是我可以在Visual Studio服务器资源管理器查询窗口中测试查询语句。

这是我尝试过的查询:

SELECT TaskName, TaskLength FROM myTable, SUM TaskLength 
WHERE TaskName='Maintenance' AND EventStartTime 
BETWEEN '8/17/2019' AND '8/19/2019' 

这是我的桌子:

TABLE myTable 
ID    TaskName      EventStartTime          TaskLength
318   START SHIFT   8/17/2019 11:51:00 AM   16                  
319   Maintenance   8/17/2019 12:07:00 PM   10                  
320   Part Prep     8/17/2019 12:17:00 PM   13                  
321   Production    8/17/2019 12:30:00 PM   117                 
322   Part Prep     8/17/2019 02:26:00 PM   45                  
323   Downtime      8/17/2019 02:28:00 PM   65                  
327   START SHIFT   8/17/2019 03:48:00 PM   00                  
328   Maintenance   8/17/2019 03:48:00 PM   25                  
329   Part Prep     8/17/2019 03:48:00 PM   35                  
330   Production    8/17/2019 03:48:00 PM   120                 
331   START SHIFT   8/17/2019 03:59:00 PM   10                  
332   Maintenance   8/17/2019 03:59:00 PM   90                  

我遇到Incorrect Syntax Near..错误。我希望当它正常工作时,我会得到125的结果。

带有完整代码块的修订查询:

using (SqlConnection con = new SqlConnection(_connectionString))
{
    string query = @"SELECT TaskName, SUM(TaskLength) as TaskLength FROM myTable " +
          "WHERE EventStartTime BETWEEN '2019/8/17' AND '2019/8/19' GROUP BY TaskName";

      using (SqlCommand cmd = new SqlCommand(query, con))
      {
          con.Open();

          object result = cmd.ExecuteScalar();  // returns 'Downtime'
          string totalMinutes = Convert.ToString(result);

      }
}

我正在进步。代码执行没有错误,只是结果从TaskName列返回“停机”,而不是我期望的SUM(TaskLength)返回125。

此查询在Visual Studio SQL查询窗口中可以正常工作。

5 个答案:

答案 0 :(得分:2)

SUM是一项功能,因此您需要使用SUM(TaskLength),然后再使用GROUP BY其他您选择的不属于聚合操作的字段。

尝试查询以下内容:

Query = 
@"SELECT TaskName, SUM(TaskLength)
 FROM myTable
 WHERE TaskName='Maintenance' AND EventStartTime
 BETWEEN '8/17/2019' AND '8/19/2019'
 GROUP BY TaskName"

答案 1 :(得分:2)

求和是在SELECT子句的SUM()函数中指定的,该函数需要一个GROUP BY子句以及SELECT子句中的所有非聚合字段。

Query = @"SELECT TaskName, sum(TaskLength) as TotalTaskLength 
          FROM myTable
          WHERE TaskName='Maintenance' 
            AND EventStartTime BETWEEN '8/17/2019' AND '8/19/2019'
          GROUP BY TaskName"

答案 2 :(得分:0)

请注意,“ 08/17/2019”表示“ 08/17/2019 00:00:00”,“ 08/19/2019”表示“ 08/19/2019 00:00:00”。您应该使用: EvenStartTime> =“ 08/17/2019”和EventStartTime

答案 3 :(得分:0)

我认为您想要一个GROUP BY查询:

SELECT TaskName, SUM(TaskLength)
FROM myTable 
WHERE TaskName = 'Maintenance' AND
      EventStartTime >= '2019-08-17' AND
      EventStartTime < '2019-08-20'
GROUP BY TaskName ;

注意日期比较。首先,日期值的格式为YYYY-MM-DD,这是日期的标准格式(在SQL和ISO标准中)。其次,它使用>=<。这适用于日期和时间比较,并且比BETWEEN安全。

答案 4 :(得分:0)

尽管,这个问题的答案是 SUM () Group by,但只是想考虑以下几点,因为我在任何答案中都没有注意到:

  1. 当您手动将值传递到过滤器或查询中的任何其他位置时,始终使用日期格式yyyy-mm-dd,否则SQL引擎可能会通过错误Conversion failed when converting date and/or time from character string.出现这种情况,以防SQL Server环境设置不同比我们使用的格式日期早,即查询格式MM-DD-YYYY服务器环境设置格式DD-MM-YYYY
  2. 当您执行标量函数或表达式时(在我们的情况下为sum),列标签将被删除,请确保在列标签上提及as-这是一个好习惯,您的查询无需别名即可工作
SELECT TaskName, SUM(TaskLength) as TaskLength
FROM myTable 
WHERE TaskName = 'Maintenance' AND
      EventStartTime between '2019-08-17' AND '2019-08-20'
GROUP BY TaskName 

已根据评论更新

SELECT SUM(TaskLength) as TaskLength
FROM myTable 
WHERE TaskName = 'Maintenance' AND
      EventStartTime between '2019-08-17' AND '2019-08-20'