Sql E是的,它是通用的,但是,显式地编写12个月的代码并不是什么大问题。它会破坏性能。是的,它是通用的,然而,显式编码12个月并不是什么大问题。 EMP_ID SAL_MONTHWISE(JAN) SAL_MONTHWISE(FEB) SAL_MON

Sql E是的,它是通用的,但是,显式地编写12个月的代码并不是什么大问题。它会破坏性能。是的,它是通用的,然而,显式编码12个月并不是什么大问题。 EMP_ID SAL_MONTHWISE(JAN) SAL_MONTHWISE(FEB) SAL_MON,sql,oracle,oracle11g,oracle10g,sql-order-by,Sql,Oracle,Oracle11g,Oracle10g,Sql Order By,E是的,它是通用的,但是,显式地编写12个月的代码并不是什么大问题。它会破坏性能。是的,它是通用的,然而,显式编码12个月并不是什么大问题。 EMP_ID SAL_MONTHWISE(JAN) SAL_MONTHWISE(FEB) SAL_MONTHWISE(MAR) 1 10000 15000 8000 2 20000 2000


E是的,它是通用的,但是,显式地编写12个月的代码并不是什么大问题。它会破坏性能。是的,它是通用的,然而,显式编码12个月并不是什么大问题。
EMP_ID    SAL_MONTHWISE(JAN)   SAL_MONTHWISE(FEB) SAL_MONTHWISE(MAR)
1              10000                15000              8000
2              20000                2000               10000
3              50000                60000              40000
EMP_ID    SAL_MONTH1         SAL_MONTH2        SAL_MONTH3
1            8000               10000             15000
2           2000                10000             20000
3            40000              50000             60000
SQL> WITH data AS
  2    ( SELECT 1 emp_id, 10000 jan, 15000 feb, 8000 mar FROM dual
  3    UNION ALL
  4    SELECT 2 , 20000 , 2000 , 10000 FROM dual
  5    UNION ALL
  6    SELECT 3 , 50000 , 60000 , 40000 FROM dual
  7    )
  8  SELECT emp_id,
  9    least(jan, feb, mar) jan,
 10    CASE
 11      WHEN jan > least(jan, feb, mar)
 12      AND jan   < greatest(jan, feb, mar)
 13      THEN jan
 14      WHEN feb > least(jan, feb, mar)
 15      AND feb   < greatest(jan, feb, mar)
 16      THEN feb
 17      WHEN mar > least(jan, feb, mar)
 18      AND mar   < greatest(jan, feb, mar)
 19      THEN mar
 20    END feb,
 21    greatest(jan, feb, mar) mar
 22  FROM DATA
 23  /

    EMP_ID        JAN        FEB        MAR
---------- ---------- ---------- ----------
         1       8000      10000      15000
         2       2000      10000      20000
         3      40000      50000      60000

SQL>
select * from your_table
unpivot (sal for month in (sal_jan as 'Jan', sal_feb as 'Feb', sal_mar as 'Mar'));
    EMP_ID MONTH        SAL
---------- ----- ----------
         1 Jan        10000 
         1 Feb        15000 
         1 Mar         8000 
         2 Jan        20000 
         2 Feb         2000 
         2 Mar        10000 
         3 Jan        50000 
         3 Feb        60000 
         3 Mar        40000 
select t.*, row_number() over (partition by emp_id order by sal) as rn
from your_table
unpivot (sal for month in (sal_jan as 'Jan', sal_feb as 'Feb', sal_mar as 'Mar')) t;
select * from (
  select t.emp_id, t.sal,
    row_number() over (partition by emp_id order by sal) as rn
  from your_table
  unpivot (sal for month in (sal_jan as 'Jan', sal_feb as 'Feb', sal_mar as 'Mar')) t
)
pivot (max(sal) as sal for (rn) in (1 as "1", 2 as "2", 3 as "3"))
order by emp_id;

    EMP_ID      1_SAL      2_SAL      3_SAL
---------- ---------- ---------- ----------
         1       8000      10000      15000 
         2       2000      10000      20000 
         3      40000      50000      60000 
with unpivot_data as (
  select level as unpivot_rn from dual connect by level <= 3
)
select t.emp_id,
  case ud.unpivot_rn
    when 1 then t.sal_jan
    when 2 then t.sal_feb
    when 3 then t.sal_mar
  end as sal
from t42 t
cross join unpivot_data ud;
with unpivot_data as (
  select level as unpivot_rn from dual connect by level <= 3
),
tmp_data as (
  select t.emp_id,
    case ud.unpivot_rn
      when 1 then t.sal_jan
      when 2 then t.sal_feb
      when 3 then t.sal_mar
    end as sal
  from t42 t
  cross join unpivot_data ud
)
select td.emp_id, td.sal,
  row_number() over (partition by td.emp_id order by td.sal) as rn
from tmp_data td;
with unpivot_data as (
  select level as unpivot_rn from dual connect by level <= 3
),
tmp_data as (
  select t.emp_id,
    case ud.unpivot_rn
      when 1 then t.sal_jan
      when 2 then t.sal_feb
      when 3 then t.sal_mar
    end as sal
  from your_table t
  cross join unpivot_data ud
),
tmp_with_rn as (
  select td.emp_id, td.sal,
    row_number() over (partition by td.emp_id order by td.sal) as rn
  from tmp_data td
)
select twr.emp_id,
  max(case when twr.rn = 1 then twr.sal end) as month_1,
  max(case when twr.rn = 2 then twr.sal end) as month_2,
  max(case when twr.rn = 3 then twr.sal end) as month_3
from tmp_with_rn twr
group by twr.emp_id
order by emp_id;

    EMP_ID    MONTH_1    MONTH_2    MONTH_3
---------- ---------- ---------- ----------
         1       8000      10000      15000 
         2       2000      10000      20000 
         3      40000      50000      60000