2017-04-01 111 views
1

SQL查询让我们假设一个表像消除最小和最大

Acc_nbr sal1 sal2 sal3 sal4 
123   10 20  30 40 
124   10 30  40 15 
126   16 20  25 16 

所以在上面的表我想消除分钟&最大SAL列,唯一剩下的SAL列需要采取!

例如:用于acc_nbr 123分钟SAL = 10 &最大SAL = 40 所以按我要求我需要消除两个10 & 40,&需要采取只有20 & 30. 同样相同于其它acc_nbr的。 请帮助..提前致谢!

+1

如果你有联系? –

+0

仍然消除他们..通过考虑一个为最小,另一个为最大并保持原样。例如:Sal1 sal2 sal3 sal4 40 40 40 40在这种情况下,我只想要两个可能是任何工资。 – user7600856

回答

1

这是因为各种原因一个难题:

  • 你的数据不是存储在一个合适的关系格式。但是,即使每笔薪水只存储一行数据也不会使这一过程变得更容易。
  • SQL通常没有很好的“行内”操作功能。
  • MySQL不提供数组或简单的方式来反转数据。
  • 重复值和NULL值可能真的很麻烦。

如果我认为没有价值的是NULL,你不介意重复时,有在极端的关系,那么下面将工作:

select t.*, 
     (case when sal1 not in (least(sal1, sal2, sal3, sal4), greatest(sal1, sal2, sal3, sal4)) 
      then sal1 
      when sal2 not in (least(sal1, sal2, sal3, sal4), greatest(sal1, sal2, sal3, sal4)) 
      then sal2 
      when sal3 not in (least(sal1, sal2, sal3, sal4), greatest(sal1, sal2, sal3, sal4)) 
      then sal3 
      when sal4 not in (least(sal1, sal2, sal3, sal4), greatest(sal1, sal2, sal3, sal4)) 
      then sal4 
     end) as first_sal, 
     (case when sal4 not in (least(sal1, sal2, sal3, sal4), greatest(sal1, sal2, sal3, sal4)) 
      then sal4 
      when sal3 not in (least(sal1, sal2, sal3, sal4), greatest(sal1, sal2, sal3, sal4)) 
      then sal3 
      when sal2 not in (least(sal1, sal2, sal3, sal4), greatest(sal1, sal2, sal3, sal4)) 
      then sal2 
      when sal1 not in (least(sal1, sal2, sal3, sal4), greatest(sal1, sal2, sal3, sal4)) 
      then sal1 
     end) as second_sal 
from t; 

我要指出,这几乎任何其他数据库中的问题都会更容易。

编辑:

天哪,你不提你在输出需要多少列。如果我们只是NULL了极值,这是比较容易:

select t.*, 
     (case when sal1 not in (least(sal1, sal2, sal3, sal4), greatest(sal1, sal2, sal3, sal4)) 
      then sal1 
     end) as sal1, 
     (case when sal2 not in (least(sal1, sal2, sal3, sal4), greatest(sal1, sal2, sal3, sal4)) 
      then sal1 
     end) as sal2, 
     (case when sal3 not in (least(sal1, sal2, sal3, sal4), greatest(sal1, sal2, sal3, sal4)) 
      then sal1 
     end) as sal3, 
     (case when sal4 not in (least(sal1, sal2, sal3, sal4), greatest(sal1, sal2, sal3, sal4)) 
      then sal1 
     end) as sal4 
from t; 

这仍然假定四个sal值不NULL

+0

谢谢!但是,如果在sal1和sal2中有一个空值,但是剩余的列不是空值,你能解释一下吗? – user7600856

0

合并类排序

select Acc_nbr, greatest(sal1,sal2) salA, least(sal3,sal4) salB 
from (
    select Acc_nbr, sal1, least(sal2,sal3) sal2, greatest(sal2,sal3) sal3, sal4 
    from (
     select Acc_nbr, least(sal1,sal2) sal1, greatest(sal1,sal2) sal2, least(sal3,sal4) sal3, greatest(sal3,sal4) sal4 
     from tbl 
     ) t1 
    ) t2; 

可包装成单一的选择,它只是会有点冗长。

+0

你是谢谢你! – user7600856

+0

如果sybase等特定数据库中没有最少和最大的功能支持,该怎么办?我们怎么写这个? – user7600856

+0

看起来像Sybase支持'APPLY' http://dcx.sybase.com/1101/en/dbusage_en11/apply-joins-joinsasp.html这使得行内计算相当简单的任务。 – Serg