我有这张 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/