每行的MYSQL总和并限制为最好的15

标签 mysql sql row

我有这张 table :扩展

+--------+-----+-----+-----+-----+-  -+-----+-----+
| Name   |  T1 | T2  | T1  | T3  | .. | T19 | T20 |
+--------+-----+-----+-----+-----+-  -+-----+-----+
| john   |  5  | 10  | 50  | 10  | .. | 20  | 8   |
| bill   |  2  | 8   | 11  | 5   | .. | 9   | 55  |
| james  |  30 | 15  | 12  | 40  | .. | 13  | 10  |
| elsie  |  28 | 35  | 20  | 32  | .. | 18  | 1   |
|  ....  |  .. | ..  | ..  | ..  | .. | ..  | ..  |
+--------+-----+-----+-----+-----+-  -+-----+-----+

我想退回这个:

+--------+-------+-----+-----+-----+-----+-  -+-----+-----+
| Name   | TOTAL |  T1 | T2  | T1  | T3  | .. | T19 | T20 |
+--------+-------+-----+-----+-----+-----+-  -+-----+-----+
| bill   |  250  |  2  | 8   | 11  | 5   | .. | 9   | 55  |
| john   |  230  |  5  | 10  | 50  | 10  | .. | 20  | 8   |
| elsie  |  158  |  28 | 35  | 20  | 32  | .. | 18  | 1   |
| james  |  129  |  30 | 15  | 12  | 40  | .. | 13  | 10  |
|  ....  |  .... | ..  | ..  | ..  | ..  | .. | ..  | ..  |
+--------+-------+-----+-----+-----+-----+----+-----+-----+

按总计排序。这个总数是 15 个 Tx 中最好的总和 ...

我现在不知道该怎么做。

该表来自另一个包含大量数据的表的请求(创建 View )。

你能帮帮我吗?

此时,我对所有 Tx 求和,但这不是我想要的......

SELECT `Name`, (T1+T2+ T3+T4+T5+T6+T7+T8+T9+T10+T11+T12+T13+T14+T15+T16+T17+T18+T19+T20) AS TOTAL, T1,T2, T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20
FROM `extended`
ORDER BY TOTAL DESC

最佳答案

如果你想删除最低值,那很简单:

select name,
       (t1 + . . . + t20) -
        least(t1, . . . , t20)
from table;

不幸的是,MySQL 没有nth 函数,因此要获得次少和其他是相当困难的。

如果您将值放在不同的行中,您可以:

select name, sum(t)
from (select en.*,
             if(@name = name, @rn := @rn + 1, @rn := 1) as rn,
             @name := name
      from extended_norm en cross join
           (select @name := '', @rn := 0) const
      order by name, t desc
     ) en
where rn <= 15
group by name;

对于您的数据结构,您可能需要编写一个用户定义的函数来执行您想要的操作。

编辑:

如果你想要 t 的列表,你可以通过两种方式来实现。您可以修改上面的内容以包括数据透视表(这假设您有一个名为 tnumber 的列来标识哪个 t 值):

select name, sum(case when rn <= 15 then t end) as Total,
       max(case when en.tnumber = 1 then t end) as T1,
       max(case when en.tnumber = 2 then t end) as T2,
       . . .
       max(case when en.tnumber = 1 then t end) as T20
from (select en.*,
             if(@name = name, @rn := @rn + 1, @rn := 1) as rn,
             @name := name
      from extended_norm en cross join
           (select @name := '', @rn := 0) const
      order by name, t desc
     ) en
group by name;

否则,采用上述查询并将其连接到非规范化表:

select e.*, tt.total
from extended e join
     (the above query) tt
     on e.name = tt.name;

关于每行的MYSQL总和并限制为最好的15,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18785451/

相关文章:

php - RedBeanPHP 中具有两列主键的表

sql - 如何删除父子记录

html - 如何保持不同高度的 div 列对齐?

pandas - 如何根据列中的值预先选择数据表中的行?

mysql - 计算mysql数据库中的行数

MySQL Select 使用 COUNT 返回错误的 NULL 值

MySQL获取结果,总结一下

mysql - 我应该使用哪些数据类型?

python - 高效查询图结构

c# - 如何在 C# 中单击按钮时将 datagridview 值插入数据库