【问题标题】:Return multi columns result from single table with zero values从具有零值的单个表返回多列结果
【发布时间】:2016-05-28 07:39:44
【问题描述】:

我有一个像这样的表:

mysql> select RefID,State,StartTime,EndTime from execReports limit 5; +----------------------------+---------- -+----------------------+----------+ |参考号 |状态 |开始时间 |结束时间 | +----------------------------+---------- -+----------------------+----------+ | 00019a52-8480-4431-9ad2-3767c3933627 |已完成 | 2016-04-18 13:45:00 | 2016-04-18 13:45:01 | | 00038a8a-995e-4cb2-a335-cb05d5b3e92d |中止 | 2016-05-03 04:00:00 | 2016-05-03 04:00:02 | | 001013f8-0b86-456f-bd59-a7ef066e565f |已完成 | 2016-04-14 03:30:00 | 2016-04-14 03:30:11 | | 001f8d23-3022-4271-bba0-200494de678a |失败 | 2016-04-30 05:00:00 | 2016-04-30 05:00:02 | | 0027ba42-1c37-4e50-a7d6-a4e24056e080 |已完成 | 2016-04-18 03:45:00 | 2016-04-18 03:45:02 | +----------------------------+---------- -+----------------------+----------+

我可以提取每个状态的 exec 计数:

mysql> select distinct State,count(StartTime) as nbExec from execReports group by State; +-----------+--------+ |状态 | nbExec | +-----------+--------+ |中止 | 3 | |已完成 | 14148 | |失败 | 49 | +-----------+--------+ 一组 4 行(0.02 秒)

我可以使用以下方法提取每周的 exec 计数:

mysql> select distinct extract(week from StartTime) as Week, count(StartTime) as nbExec from execReports group by Week; +--------+--------+ |周 | nbExec | +--------+--------+ | 14 |第1317章 | 15 | 3051 | | 16 | 3066 | | 17 | 3059 | | 18 | 3059 | | 19 |第652章 +--------+--------+ 6 行(0.01 秒)

但我想提取一个交叉表,例如:

+--------+---------+------------+--------+---------+- --------+ |周 | nbExec |已完成 |失败 |跑步 |中止 | +--------+---------+------------+--------+---------+- --------+ | 14 |第1317章1312 | 3 | 1 | 1 | | 15 | 3051 | 3050 | 1 | 0 | 0 | | 16 | 3066 | 3060 | 3 | 2 | 1 | | 17 | 3059 | 3058 | 0 | 1 | 0 | | 18 | 3059 | 3057 | 1 | 0 | 1 | | 19 |第652章第652章0 | 0 | 0 | +--------+---------+------------+--------+---------+- --------+

我被困了几天。任何帮助表示赞赏。

最好的问候

【问题讨论】:

标签: mysql left-join zero cross-join


【解决方案1】:
select extract(week from StartTime) as Week, count(StartTime) as nbExec, 
       sum(if(state="Completed",1,0)) Completed,
       sum(if(state="Failed",1,0)) Failed,
       sum(if(state="Aborted",1,0)) Aborted
    from execReports group by Week;

demo

【讨论】:

  • 商品解决方案。在 MySQL 中:true= 1,false = 0。因此您可以简单地写成sum(state='Completed') as Completed
  • @ThorstenKettner 我从那个开始,但可能在 smthg 上错了,然后又回到了更经典的方式:)
【解决方案2】:

您可以为此加入多个表。如果您想要动态的行到列,请检查:MySQL pivot row into dynamic number of columns

SELECT 
   a.week, 
   count(a.StartTime) as nbExec,
   count(b1.StartTime) as Completed,
   count(b2.StartTime) as Failed,
   count(b3.StartTime) as Running,
   count(b4.StartTime) as Aborted,

FROM execReports a
LEFT JOIN execReports b1 ON a.refID = b1.refID and b1.state ='Completed'
LEFT JOIN execReports b2 ON a.refID = b2.refID and b2.state ='Failed'
LEFT JOIN execReports b3 ON a.refID = b3.refID and b3.state ='Running'
LEFT JOIN execReports b4 ON a.refID = b4.refID and b4.state ='Aborted'
GROUP BY 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    • 2020-04-14
    • 2015-11-17
    相关资源
    最近更新 更多