我正在尝试创建一个查询语句,该语句将找到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查询窗口中可以正常工作。
答案 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
,但只是想考虑以下几点,因为我在任何答案中都没有注意到:
yyyy-mm-dd
,否则SQL引擎可能会通过错误Conversion failed when converting date and/or time from character string.
出现这种情况,以防SQL Server环境设置不同比我们使用的格式日期早,即查询格式MM-DD-YYYY
服务器环境设置格式DD-MM-YYYY
。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'