我在mysql表5列:最大值行明智在MySQL
name s1 s2 s3 s4 A 1 2 3 4 B 15 6 7 8
我要计算的列名和值保持这个最大值了S1,S2,S3,S4的内行,即,
name col value A s4 4 B s1 15
我不能使用max,因为它计算列明智的最大值。我该如何做到这一点?
PS:架构无法更改,因为在所有其他用例中,我必须明智地显示信息名称。
在此先感谢。
我在mysql表5列:最大值行明智在MySQL
name s1 s2 s3 s4 A 1 2 3 4 B 15 6 7 8
我要计算的列名和值保持这个最大值了S1,S2,S3,S4的内行,即,
name col value A s4 4 B s1 15
我不能使用max,因为它计算列明智的最大值。我该如何做到这一点?
PS:架构无法更改,因为在所有其他用例中,我必须明智地显示信息名称。
在此先感谢。
,如果你想获得其他值,我们可以在情况改变这一点,你可以利用这一点,但是请注意,在这种情况下,如果你在两个不同的列得到了最大价值,你会得到空值
select name,
case when s1>s2 and s1>s3 and s1>s4 then 's1'
when s2>s1 and s2>s3 and s2>s4 then 's2'
when s3>s1 and s3>s2 and s3>s4 then 's3'
when s4>s1 and s1>s2 and s1>s3 then 's4' as col
case when s1>s2 and s1>s3 and s1>s4 then s1
when s2>s1 and s2>s3 and s2>s4 then s2
when s3>s1 and s3>s2 and s3>s4 then s3
when s4>s1 and s1>s2 and s1>s3 then s4 as value
from my_table
有没有一种方法可以将这两个case语句合并为1,即case返回多个值?另外,concat是一种方式,但我不想为此付出代价。 – proprius
每种情况下给你一个列,既然你想要两个不同的列,你需要两个案例 – user3600910
你可以结合他们,用逗号或其他字符分隔值,但你会收到他们在一列,在你问你问两个不同的列 – user3600910
您的表中的正确数据结构是这样的:
name | column | value
-----|--------|------
A | s1 | 1
A | s2 | 2
A | s3 | 3
A | s4 | 4
B | s1 | 15
B | s2 | 6
B | s3 | 7
B | s4 | 8
,然后你的查询会是这样的:
select *
from tablename
where (name, value) in (select name, max(value)
from tablename
group by name)
但你怎么想管理领带(?两列具有相同的最大值)
如果你不能改变你的数据结构还有什么可以做,获得最大值很容易:
select name, greatest(s1, s2, s3, s4)
from tablename
但得到也在其列名是有点棘手:
select
name,
max_value,
case when p=1 then 's1'
when p=2 then 's2'
when p=3 then 's3'
when p=4 then 's4'
end as col_name
from (
select
name,
greatest(s1, s2, s3, s4) as max_value,
field(greatest(s1, s2, s3, s4), s1, s2, s3, s4) as p
from
tablename
) s
或本:
select
name,
greatest(s1, s2, s3, s4) as max_value,
substring_index(substring_index('s1,s2,s3,s4', ',', field(greatest(s1, s2, s3, s4), s1, s2, s3, s4)), ',', -1) as p
from
更改你的数据库结构 – Strawberry
有没有像在MySQL中的枢轴? –
@RogueCoder group by在mysql中用作数据透视表。 – proprius