目前,我有一个名为mytable的DB表,如下所示
| 标识符|开始时间|结果|
| - -|- -|- -|
| 100个|2022年11月17日06:19:00|通过|
| 一百零一|2022年11月17日07:19:00|失败了|
| 一百零二|2022年11月17日08时44分|通过|
| 一百零三|2022年11月17日16时19分|失败了|
| 一百零四|2022年11月16日06:11:00|通过|
| 一百零五|2022年11月16日06:11:00|失败了|
| 一百零六|2022年11月16日06:12:00|通过|
| 一百零七|2022年11月16日12时11分|通过|
这需要转化为
| 日期|通过|失败了|
| - -|- -|- -|
| 2022年11月17日|2个|2个|
| 2022年11月16日|三个|一个|
对此我可以使用什么查询?
我试过了
SELECT result, DATE(startTime), COUNT(result)
FROM mytable
GROUP BY DATE(startTime), result;
但那不正常
3条答案
按热度按时间56lgkhnf1#
您可以使用 * 条件聚合 *,仅按日期(
DATE(startTime)
)分组,例如mbzjlibv2#
让我们先说:如果你100%确定你总是有“通过”和“失败”这两个值,并且带有这些硬编码条件的查询总是能产生正确的结果,那么就使用Barbaros给出的查询。在这种情况下,没有更好的方法了。那么你可以忽略我的答案的其余部分。
但让我们跳出常规思考:这样的查询通常是有风险的,因为人们并没有真正考虑到可能性。硬编码条件有一个很大的缺点,那就是它们忽略了其他选项。假设在你的表中也有“unknown”或“ok”或“nok”这样的条目。你没有注意到这一点,现在你错过了这些信息,你的查询产生了不正确的结果。
因此,如果可能发生这种情况,请不要使用硬编码条件。
在本例中,我们只对结果进行计数并按结果分组:
这将确保您将获得表中出现的每个结果的信息。如果结果不具有预期的形式,也可以在SQL中使用子查询进行调整。但我认为这最好由您的应用程序来完成。
dced5bon3#
这是在SQL中使用
aggregating
的典型情况。Aggregating
由两部分组成aggregate function
-进行一些计算GROUP BY
关键字-计算对象在这种情况下,计算结果必须是
SUM()
,即回答“多少...”如果我们使用
SUM()
而不使用GROUP BY
我们将得到一个单行表
日期变得毫无意义,因为
pass
或fail
的值是涵盖所有日期的汇总。我们需要使用
GROUP BY
来获取每个日期的摘要这将给出预期的表。
希望能有所帮助。