2017-03-02 57 views
2

我在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:架构无法更改,因为在所有其他用例中,我必须明智地显示信息名称。

在此先感谢。

+0

更改你的数据库结构 – Strawberry

+0

有没有像在MySQL中的枢轴? –

+0

@RogueCoder group by在mysql中用作数据透视表。 – proprius

回答

0

,如果你想获得其他值,我们可以在情况改变这一点,你可以利用这一点,但是请注意,在这种情况下,如果你在两个不同的列得到了最大价值,你会得到空值

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 
+0

有没有一种方法可以将这两个case语句合并为1,即case返回多个值?另外,concat是一种方式,但我不想为此付出代价。 – proprius

+0

每种情况下给你一个列,既然你想要两个不同的列,你需要两个案例 – user3600910

+0

你可以结合他们,用逗号或其他字符分隔值,但你会收到他们在一列,在你问你问两个不同的列 – user3600910

3

您的表中的正确数据结构是这样的:

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 
+0

我已经更新了这个问题。由于其他功能要求,我无法更改表结构。 – proprius

+0

@proprius你试过我的第二个解决方案吗? – fthiella

+0

是的..我现在使用最大的功能,但我不能使用substring_index部分..这是因为我的列名可能有'''或','。 – proprius