Sunday, 22 January 2017

COMPLEX SQL QUERIES

  1. To find the nth row of a table 
SQL> Select *from emp where rowid = (select max(rowid) from emp where rownum  
        <= 4); 




Or 
   SQL> Select *from emp where rownum <= 4 minus select *from emp where rownum  
           <= 3; 
  1. To find duplicate rows 
SQL> Select *from emp where rowid not in (select max(rowid) from emp group by  
         empno, ename, mgr, job, hiredate, comm, deptno, sal); 
  Or 
 SQL> Select empno,ename,sal,job,hiredate,comm , count(*) from emp group by  
         empno,ename,sal,job,hiredate,comm  having count(*) >=1;  
  
  1. To delete duplicate rows 
      SQL> Delete from emp where rowid not in (select max(rowid) from emp group by  
              empno,ename,mgr,job,hiredate,sal,comm,deptno); 
  
  1. To find the count of duplicate rows 
      SQL> Select ename, count(*) from emp group by ename having count(*) >= 1; 
  1. How to display alternative rows in a table? 
          SQL> select *from emp where (rowid,0) in (select rowid,mod(rownum,2) from emp); 
  1. Getting employee details of each department who is drawing maximum sal? 
       SQL> select *from emp where (deptno,sal) in 
      ( select deptno,max(sal)  from emp group by deptno); 
  1. How to get number of employees in each department  , in which department is having more than 2500 employees? 
       SQL> Select deptno,count(*) from emp group by  deptno having count(*) >2500; 
  1. To reset the time to the beginning of the day 
                  SQL> Select to_char(trunc(sysdate),’dd-mon-yyyy hh:mi:ss am’) from dual; 
  1. To find nth maximum sal 
  SQL> Select *from emp where sal in (select max(sal) from (select *from emp order  
          by sal) where rownum <= 5); 
  1. Which Employees are not Managers? 
SQL> select * from Emp e where e.empno not in ( select mgr from emp e1 where e.empno= e1.mgr); 
  1. Display Names who earns highest Salary? 
SQL> Select ename, sal from emp where sal > ( select max(sal) from emp); 
  1. Display Em- from Dept 10 & Greater than any of employee working in other Dept. 
SQL> Select ename, Dept, Sal  from emp where sal > ( select max(sal) from emp where deptno = 10) and deptno = 10 group by deptno ; 
  1. Display Employees whose salary is more than their Managers 
SQL> select e.Sal, e1.sal, e.ename, e1.ename from emp e, emp e1 where e.ename=e1.mgr and e.sal>e.sal; 
  1. Which Job group having total salary greater than Max Sal for Manager 
SQL> select ename, Job,sum(Sal) from emp group by ename, Job having sal> (select max(sal) from emp where job= ‘Manager’); 
  1. Display common jobs in Dept 10, 20 
SQL> select Job from emp where job in ( select job from emp where deptno=20) and deptno=10; 
  1. Display top 5 Employees ( Designation) 
SQL> Select level, ename, job, mgr from emp where level<=5 connect by prior empno=mgr start with mgr is null; 
  1. Display the Employees who joined in same day? 
SQL> select e.ename, e1.ename from emp e,e1 where e.hiredate = e1.hiredate and e.ename != e1.ename 

18) Display Odd Records and Even Records separately.
Odd number of records:
select * from emp where (rowid,1) in (select rowid, mod(rownum,2) from emp);
1
3
5

Even number of records:
select * from emp where (rowid,0) in (select rowid, mod(rownum,2) from emp)
2
4
6
  
1) How to Get the Difference between 2 Timestamps Into a New Column? 
 
Sol: 
TO_TIMESTAMP( your_column2, 'MM/DD/YYYY HH24:MI') - TO_TIMESTAMP( your_column1, 'MM/DD/YYYY HH24:MI' 
 
OR 
 
( TO_DATE( your_column2, 'MM/DD/YYYY HH24:MI') - TO_DATE( your_column1, 'MM/DD/YYYY HH24:MI') ) * 24 
 
2) I need to replace multiple commas input: 11,0000,AB,015,1111,,,066,5555,,,901,6666,,100,,40 0,7777,,,,5,V,140609,  Output: 11,0000,AB,015,1111,,,~066,5555,,,,,~901,6666,,~10 0,,400,7777,,,~5,V,140609, 
 
SOL: 
replacestr(0,replacestr(0,replacestr(0,input_port, ',,,,',',~'),',,,',',~'),',,',',~') 
 
3)Sorting the columns using multiple columns 
select * 
from (select col1, col2, col3, row_number() over(order by col1, col2, col3) rn 
from ... 
where ... 
) 
where rn < 300 ; 
 1)i have a table like this emp id empname empse 12 ram 1000 13 rohan 1200 14 mohan 1300  i want to output like that   emp id empname empse empadd 12 ram 1000 1000 13 rohan 1200 2200 14 mohan 1300 2500   Sol: You can do it as follows:  select emp_id, empname, empse, sum(empse) over(order by emp_id rows between 1 preceding and current row) from your_table order by emp_id /  or, doing the same with a shorter syntax:  select emp_id, empname, empse, sum(empse) over(order by emp_id rows 1 preceding ) from your_table order by emp_id /  You should be careful and specify exactly your required ORDER BY inside the analytic SUM function.  
1) How to Get the Difference Between 2 Timestamps Into a New Column? 
Sol: 
TO_TIMESTAMP( your_column2, 'MM/DD/YYYY HH24:MI') - TO_TIMESTAMP( your_column1, 'MM/DD/YYYY HH24:MI' 
OR 
( TO_DATE( your_column2, 'MM/DD/YYYY HH24:MI') - TO_DATE( your_column1, 'MM/DD/YYYY HH24:MI') ) * 24 
2) I need to replace multiple commas input: 11,0000,AB,015,1111,,,066,5555,,,901,6666,,100,,40 0,7777,,,,5,V,140609,  Output: 11,0000,AB,015,1111,,,~066,5555,,,,,~901,6666,,~10 0,,400,7777,,,~5,V,140609, 
 
SOL: 
replacestr(0,replacestr(0,replacestr(0,input_port, ',,,,',',~'),',,,',',~'),',,',',~') 
3)Sorting the columns using multiple columnsselect * from (select col1, col2, col3, row_number() over(order by col1, col2, col3) rn from ... where ... ) where rn < 300 ;   3)Retrieve Only Duplicate Records 
Sol: 
SELECT * FROM emp aWHERE rowid = (SELECT max(rowid) FROM emp WHERE empno = a.empno GROUP BY empno HAVING count(*) >1) 
 4) How can we remove the Duplicate records in Oracle? 
 
SOL: 
 
SYNTAX 
delete from <table_name> where rowid not in                    ( select min(rowid)                      from exp group by column1..,column2,...column3..); 
 
EX: 
delete from EMP where rowid not in                    ( select min(rowid)                      from EMP group by Student_Name); 

=====================

No comments:

Post a Comment