【问题标题】:Counting total rows and grouping by a column in mysql在mysql中计算总行数并按列分组
【发布时间】:2017-08-22 02:00:30
【问题描述】:

所以我一直在看这个,但我似乎无法弄清楚。

我有一个mysql表,格式如下:

ID, Customer, Time, Error Code, Duration

1,Test1,00:12:00,400,120
2,Test2,00:14:00,404,60
3,Test1,00:15:00,404,120
4,Test2,00:17:00,503,120
5,Test1,00:19:00,400,60
6,Test1,00:20:00,400,60
7,Test2,00:21:00,503,60

我需要结果包含客户名称、每个客户名称的总行数、每个客户的错误代码、每个客户的错误数以及持续时间的总和。因此,对于上述结果,我想得到:

Test1, 4, 400, 3, 360
Test1, 4, 404, 1, 360
Test2, 2, 404, 1, 240
Test2, 2, 503, 2, 240

我遇到的问题是当我按错误代码分组时,行数的计数和持续时间的总和也按该错误代码分组。我需要客户的总行数和持续时间,而不是客户每个错误代码的总行数和持续时间。

如果我需要添加任何其他内容,或者我可能会感到非常困惑,请告诉我。

提前感谢您的所有帮助!

【问题讨论】:

  • 结果中的1 是什么意思?
  • 结果中的1是错误码数的计数。所以对于 test1 它总共有 1400 个错误代码
  • 您能否添加更多数据以使结果更明显?现在 scais 和我的查询只计算 Test1 的数量。那些是2 不是吗?
  • 我又添加了一些。为了更清楚,我将解释结果中的每一列应该是什么第 1 列:客户名称第 2 列:该客户的记录总数第 3 列:每个客户的每个错误代码:第 4 列:该总数每个客户的错误代码第 5 列:该客户的总持续时间

标签: mysql


【解决方案1】:

首先你需要 group by 来得到计算出来的列

 SELECT Customer, COUNT(*) as total_count, SUM(duration) as total_duration
 FROM yourTable
 GROUP BY  Customer

 SELECT Customer, Error, COUNT(*) as error_count
 FROM yourTable
 GROUP BY  Customer, Error

然后加入你的表

SELECT t1.Customer, 
       t2.total_count, 
       t1.error, 
       t3.error_count, 
       t2.total_duration
FROM yourTable as t1
JOIN (
     SELECT Customer, COUNT(*) as total_count, SUM(duration) as total_duration
     FROM yourTable
     GROUP BY  Customer
     ) as t2
  ON t1.Customer = t2.Customer
JOIN (
     SELECT Customer, Error, COUNT(*) as error_count
     FROM yourTable
     GROUP BY  Customer, Error
) as t3
 ON t1.Customer = t3.Customer
AND t1.Error = t3.Error
GROUP BY t1.Customer
       , t1.Error

【讨论】:

  • 现在检查,您需要两个子查询来获取这些计算。
  • 有了这个我得到 ERROR 1060 (42S21): Duplicate column name 'Error' 对不起,我有一个错字。现在试试。谢谢
  • 我不断收到重复的行,如下所示:Test1 2026 404 1997 594068 Test1 2026 404 1997 594068 Test1 2026 404 1997 594068
  • 我只需要通过 t1.customer, t1.error_code 添加一个组,就可以了!非常感谢!
  • 是我的错,是逗号而不是点。是的,最后缺少GROUP BY
【解决方案2】:

您可以在子选择上使用连接和客户的总和 您可以在子选择上使用连接与客户的总和

select a.customer, a.error, t.num_row, t.duration 
from my_table   a
inner join ( 
    select  customer, count(*) as num_row, sum(duration) duration 
    from my_table 
    group by customer 
  ) t on t.customer  = a.customer

【讨论】:

    猜你喜欢
    • 2019-10-27
    • 2011-04-08
    • 1970-01-01
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    相关资源
    最近更新 更多