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