在MySQL中按特定列分组后创建单独的列

7rtdyuoh  于 2022-11-21  发布在  Mysql
关注(0)|答案(3)|浏览(95)

目前,我有一个名为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;

但那不正常

56lgkhnf

56lgkhnf1#

您可以使用 * 条件聚合 *,仅按日期(DATE(startTime))分组,例如

SELECT DATE(startTime) AS `date`, 
       SUM(result = 'pass') AS `pass`, 
       SUM(result = 'fail') AS `fail`
  FROM mytable  
 GROUP BY 1
 ORDER BY 1 DESC -- if needed
mbzjlibv

mbzjlibv2#

让我们先说:如果你100%确定你总是有“通过”和“失败”这两个值,并且带有这些硬编码条件的查询总是能产生正确的结果,那么就使用Barbaros给出的查询。在这种情况下,没有更好的方法了。那么你可以忽略我的答案的其余部分。
但让我们跳出常规思考:这样的查询通常是有风险的,因为人们并没有真正考虑到可能性。硬编码条件有一个很大的缺点,那就是它们忽略了其他选项。假设在你的表中也有“unknown”或“ok”或“nok”这样的条目。你没有注意到这一点,现在你错过了这些信息,你的查询产生了不正确的结果。
因此,如果可能发生这种情况,请不要使用硬编码条件。
在本例中,我们只对结果进行计数并按结果分组:

SELECT DATE(startTime) AS `date`, 
       result,
       COUNT(result) AS resultQty
  FROM mytable  
 GROUP BY DATE(startTime), result
 ORDER BY DATE(startTime) DESC;

这将确保您将获得表中出现的每个结果的信息。如果结果不具有预期的形式,也可以在SQL中使用子查询进行调整。但我认为这最好由您的应用程序来完成。

dced5bon

dced5bon3#

这是在SQL中使用aggregating的典型情况。
Aggregating由两部分组成

  1. aggregate function-进行一些计算
  2. GROUP BY关键字-计算对象
    在这种情况下,计算结果必须是SUM(),即回答“多少...”
    如果我们使用SUM()而不使用GROUP BY
SELECT 
    DATE(startTime) AS date,
    SUM(result = 'pass') AS pass,
    SUM(result = 'fail') AS fail
FROM mytable

我们将得到一个单行表

日期变得毫无意义,因为passfail的值是涵盖所有日期的汇总。
我们需要使用GROUP BY来获取每个日期的摘要

SELECT 
    DATE(startTime) AS date,
    SUM(result = 'pass') AS pass,
    SUM(result = 'fail') AS fail
FROM mytable
GROUP BY date
ORDER BY date DESC

这将给出预期的表。
希望能有所帮助。

相关问题