I Have Purchase Table Containing 5 Columns
Columns Names Are
CustomerID, BillID, ProductID, unatity, Payment_Type
Columns Values Are
CID00001, BID00001, PID001, 1, Card
Total Customers Count - 37156
DISTINCT Customers Count - 26053
How to Find the repeat Customers? (37156 - 26053 = 11103)
Aggregation is one way:
SELECT COUNT(*) AS num_repeat
FROM
(
SELECT CustomerID
FROM purchases
GROUP BY CustomerID
HAVING COUNT(*) > 1
) t;
To get the list of repeat customers,
SELECT CustomerID, COUNT(*) AS PurchaseCount
FROM purchases
GROUP BY CustomerID
HAVING COUNT(*) > 1
You can use this :
SELECT * FROM Purchase
WHERE CustomerID
IN(
SELECT CustomerID FROM Purchase
GROUP BY CustomerID HAVING COUNT(*) > 1
)
I'm trying to figure out a query which show the Out of the employees, who makes the MINIMUM money?
Emp_Table
EmpName | Salary | Gender
With the right query, the result should be 1 (employee) with the minimum salary
I tried with the following query
SELECT MIN(SALARY)
FROM Emp_Table
I don't know how can we display employee name as we have to set query on the basis of salary I'm learning the concept and googled it but didn't get a satisfactory answer
Please help me out.
Thanks.
The following should give you top 1 employee name and his/her salary which is equal to the minimum salary amongst all.
(Remove TOP 1 if you want all of them.)
SELECT TOP 1 EmpName, Salary
FROM Emp_Table
WHERE Salary = (SELECT MIN(Salary) FROM Emp_Table);
If multiple records having the same minimum salary value, then you can use the following query. It works for both SQL Server and MySql.
Query
select * from Emp_Table
where salary = (
select min(salary) from Emp_Table
);
use order by with top 1
For mssql
SELECT top 1 *
FROM Emp_Table
order by Salary asc
For mysql
SELECT *
FROM Emp_Table
order by Salary asc
limit 1
Try this:
--MySQL
SELECT E1.Employee_name
FROM Employee_table E1
WHERE E1.Salary = ( SELECT MIN(E2.Salary)
FROM Employee_table E2)
ORDER BY E1.Employee_name
LIMIT 1
--Oracle
SELECT E1.Employee_name
FROM Employee_table E1
WHERE E1.Salary = ( SELECT MIN(E2.Salary)
FROM Employee_table E2)
ORDER BY E1.Employee_name
FETCH FIRST 1 ROWS ONLY
I have an employee table in MySQL with below entries. I need to find all the employees having second highest salaries. In this case, it would be c and d.
id | name | salary
1 | a | 1000
2 | b | 1000
3 | c | 500
4 | d | 500
5 | e | 400
I tried running below query
SELECT name, MAX(salary) FROM employee WHERE salary < (SELECT MAX(salary) from employee);
But this query returns just c as a result. How to get both c and d in result?
I looked at bunch of similar questions posted but none of them mentioned how to get multiple rows for second highest salary.
You can esily get second highest salary from table
SELECT MAX(salary) FROM Employee WHERE Salary NOT IN ( SELECT Max(Salary) FROM Employee);
You can find the second highest salary with:
SELECT salary
FROM employee
GROUP BY salary
ORDER BY salary DESC
LIMIT 1, 1
Then either feed the result of that to another query in the same transaction:
SELECT *
FROM employee
WHERE salary = ?
Or do it as a subquery:
SELECT *
FROM employee
WHERE salary = (
SELECT salary
FROM employee
GROUP BY salary
ORDER BY salary DESC
LIMIT 1, 1
)
In case you want migrate to MSSQL Server :).
SELECT * FROM (
SELECT MAX(salary) T,RANK() OVER (ORDER BY SALARY DESC) AS RankBySalary FROM Employees
GROUP BY SALARY ) TB
WHERE RankBySalary = 3
Or much better:
SELECT * FROM
(
SELECT ID,NAME,SALARY,DENSE_RANK() OVER (ORDER BY SALARY DESC) AS RankBySalary FROM employee
)
TB WHERE RankBySalary = 2
SELECT *
FROM employee one1
WHERE ( N ) = (
SELECT COUNT( one2.salary )
FROM employee one2
WHERE one2.salary > one1.salary
)
Note : N means Nth highest salary
Demo
First find the second highest salary amount then select the rows having that salary.
Query
select * from Employees
where Salary = (
select min(t.salary) from (
select salary
from Employees
group by salary
order by salary desc limit 2
)t
);
SQL Fiddle demo
I suggest that you must first select the 2nd highest salary first and then use the derived table with JOIN on original table. like this:
SELECT
original_record.*
FROM
salary_record AS original_record
JOIN
(SELECT
distinct salary
FROM
salary_record
ORDER BY 1
LIMIT 1,1
) AS derived_record
ON
original_record.salary = derived_record.salary
PS: I have renamed your employee table as salary_record table
Also have a look at Varoon Sahgal's article on Nth highest salary, here: http://www.programmerinterview.com/index.php/database-sql/find-nth-highest-salary-sql/ . The comments-section of this article as well as the article itself has some optimized examples.
select name,max(salary) from employee x where (n-1)=(select count(distinct salary)from employee y where x.salary<y.salary);
Nth max salary
-- IF THIS TABLE EXISTS, DROP IT
DROP TABLE E2;
-- THE FOLLOWING CTE ARRANGES SALARIES IN DECENDING ORDER
WITH copytable(Salary) AS
(
SELECT Emp1.Salary
FROM Employees AS Emp1, Employees AS Emp2
WHERE Emp1.Salary > Emp2.salary
GROUP BY Emp1.Salary
)
-- COPY THE CTE IN A TABLE
SELECT * INTO E2 FROM copytable
-- GIVES THE RANK TO THE SALARY IN DECENDING ORDER
ALTER TABLE E2
ADD RankOfSalary INT IDENTITY(1, 1)
-- TO GET THE LOWEST RANK WHICH WILL BE THE HIGHEST SALARY
DECLARE #rankOfSalary int;
SELECT #rankOfSalary = COUNT(Salary) from E2;
-- SELECTING THE SECOND LARGEST SALARY
DECLARE #SelectSalary INT
SELECT #SelectSalary = Salary from E2 where RankOfSalary = #rankOfSalary - 1;
THIS IS HOW YOU DO IT WITHOUT USING max(), order by, top in sql server
to select second largest salary of employees without using max(), order by, top in sql server
JUST WANTED TO POST THIS :p
You can get it by this:
2nd Largest Salary:
SELECT name, salary
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees WHERE salary < (SELECT MAX(salary) FROM employees))
3rd Largest Salary:
SELECT name, salary
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees WHERE salary < (SELECT MAX(salary) FROM employees WHERE salary < (SELECT MAX(salary) FROM employees)))
Helpful links:
http://www.mysqltutorial.org/select-nth-highest-record-database-table-using-mysql.aspx
http://www.programmerinterview.com/index.php/database-sql/find-nth-highest-salary-sql/
http://www.coderanch.com/t/530503/JDBC/databases/select-Nth-highest-salary-table
try this TO GET BOTH c AND d
SELECT
name, salary
FROM
employee
WHERE salary = (
SELECT salary
FROM employee
GROUP BY salary
ORDER BY salary DESC
LIMIT 1,1
);
How to get the sum of distinct IDs and their respective salaries?
ID Salary
1 1000
2 2000
1 1000
2 2000
In above I want to get the out like this
Total salary
3000
I tried and made the output like this
ID Salary
1 1000
2 2000
select distinct(id), sum (salary) from employee group by id
Main issue is that I am not able to total after applying distinct to the ID.
Want to remove the duplicate entries of id and sum of there distinct ID?
Check this Query is,
Query
SELECT SUM (
DISTINCT salary
) FROM employee
Result
SUM(DISTINCT SALARY)
--------------------
3000
Check Demo SQLFiddle
You can do also by this way,
SELECT SUM(salary)
FROM (SELECT DISTINCT id, salary
FROM employee
GROUP BY id,salary
) AS emp
Check this Demo SQLfiddle
Try this 100% work
SELECT SUM(salary) as "Total salary"
FROM(SELECT DISTINCT id, salary FROM
employee GROUP BY id,salary ) as e
Try Like This
select sum(salary) from( select distinct id, salary from
employee) as t
Simplest way would be, remove duplicate records and write simple query. Second way is this query, in which I have taken MAX(Highest) salary for each employee in sub query, and then applied SUM() from calculating total salary.
SELECT SUM (sal) from
(
SELECT MAX (salary) as sal
FROM employee GROUP BY id
) as tbl
Try this:
It will work definitely
It will sum of salary with same id only.
Select SUM(salary) as total from employee group by id;
Suppose that you are given the following simple database table called Employee that has 2 columns named Employee ID and Salary:
Employee
Employee ID Salary
3 200
4 800
7 450
I wish to write a query select max(salary) as max_salary, 2nd_max_salary from employee
then it should return
max_salary 2nd_max_salary
800 450
i know how to find 2nd highest salary
SELECT MAX(Salary) FROM Employee
WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employee )
or to find the nth
SELECT FROM Employee Emp1 WHERE (N-1) = ( SELECT COUNT(DISTINCT(Emp2.Salary)) FROM Employee Emp2
WHERE Emp2.Salary > Emp1.Salary)
but i am unable to figureout how to join these 2 results for the desired result
You can just run 2 queries as inner queries to return 2 columns:
select
(SELECT MAX(Salary) FROM Employee) maxsalary,
(SELECT MAX(Salary) FROM Employee
WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employee )) as [2nd_max_salary]
SQL Fiddle Demo
Try like this
SELECT (select max(Salary) from Employee) as MAXinmum),(max(salary) FROM Employee WHERE salary NOT IN (SELECT max(salary)) FROM Employee);
(Or)
Try this, n would be the nth item you would want to return
SELECT DISTINCT(Salary) FROM table ORDER BY Salary DESC LIMIT n,1
In your case
SELECT DISTINCT(column_name) FROM table_name ORDER BY column_name DESC limit 2,1;
Simplest way to fetch second max salary & nth salary
select
DISTINCT(salary)
from employee
order by salary desc
limit 1,1
Note:
limit 0,1 - Top max salary
limit 1,1 - Second max salary
limit 2,1 - Third max salary
limit 3,1 - Fourth max salary
The Best & Easiest solution:-
SELECT
max(salary)
FROM
salary
WHERE
salary < (
SELECT
max(salary)
FROM
salary
);
You can write 2 subqueries like this example
SELECT (select max(Salary) from Employee) as max_id,
(select Salary from Employee order by Salary desc limit 1,1) as max_2nd
Select Distinct sal From emp Order By sal Desc Limit 1,1;
It will take all Distinct sal. And Limit 1,1 means: leaves top one record and print 1 record.
$q="select * from info order by salary desc limit 1,0"; // display highest 2 salary
or
$q="select * from info order by salary desc limit 1,0"; // display 2nd highest salary
I think, It is the simplest way to find MAX and second MAX Salary.You may try this way.
SELECT MAX(Salary) FROM Employee; -- For Maximum Salary.
SELECT MAX(Salary) FROM Employee WHERE Salary < (SELECT MAX(Salary) FROM Employee); -- For Second Maximum Salary
i think that the simple way in oracle is this:
SELECT Salary FROM
(SELECT DISTINCT Salary FROM Employee ORDER BY Salary desc)
WHERE ROWNUM <= 2;
`select max(salary) as first, (select salary from employee order by salary desc limit 1, 1) as second from employee limit 1`
For max salary simply we can use max function, but second max salary we should use sub query. in sub query we can use where condition to check second max salary or simply we can use limit.
You can write SQL query in any of your favorite database e.g. MySQL, Microsoft SQL Server or Oracle. You can also use database specific feature e.g. TOP, LIMIT or ROW_NUMBER to write SQL query, but you must also provide a generic solution which should work on all database. In fact, there are several ways to find second highest salary and you must know a couple of them e.g. in MySQL without using the LIMIT keyword, in SQL Server without using TOP and in Oracle without using RANK and ROWNUM.
Generic SQL query:
SELECT
MAX(salary)
FROM
Employee
WHERE
Salary NOT IN (
SELECT
Max(Salary)
FROM
Employee
);
Another solution which uses sub query instead of NOT IN clause. It uses < operator.
SELECT
MAX(Salary)
FROM
Employee
WHERE
Salary < (
SELECT
Max(Salary)
FROM
Employee
);
This solution will give all employee name and salary who have second highest salary
SELECT name, salary
FROM employee
WHERE salary = (
SELECT
salary
FROM employee AS emp
ORDER BY salary DESC
LIMIT 1,1
);
Find Max salary of an employee
SELECT MAX(Salary) FROM Employee
Find Second Highest Salary
SELECT MAX(Salary) FROM Employee
Where Salary Not In (Select MAX(Salary) FROM Employee)
OR
SELECT MAX(Salary) FROM Employee
WHERE Salary <> (SELECT MAX(Salary) FROM Employee )
This will be the simplest code format :
select max(salary) as 'max_salary',
(select salary from employee order by salary desc limit 1,1) as
'2nd_max_salary'
from employee;
For finding the nth highest salary, syntax is :
select max(salary) as 'max_salary',
(select salary from employee order by salary desc limit n-1,1) as
'nth_max_salary'
from employee;
Not really a nice query but :
SELECT * from (
SELECT max(Salary) from Employee
) as a
LEFT OUTER JOIN
(SELECT MAX(Salary) FROM Employee
WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employee )) as b
ON 1=1
For unique salaries (i.e. first can't be same as second):
SELECT
MAX( s.salary ) AS max_salary,
(SELECT
MAX( salary )
FROM salaries
WHERE salary <> MAX( s.salary )
ORDER BY salary DESC
LIMIT 1
) AS 2nd_max_salary
FROM salaries s
And also because it's such an unnecessary way to go about solving this problem (Can anyone say 2 rows instead of 2 columns, LOL?)
Try
SELECT
SUBSTRING( GROUP_CONCAT( Salary ), 1 , LOCATE(",", GROUP_CONCAT( Salary ) ) -1 ) AS max_salary,
SUBSTRING( GROUP_CONCAT( Salary ), LOCATE(",", GROUP_CONCAT( Salary ) ) +1 ) AS second_max_salary
FROM
(
SELECT Salary FROM `Employee` ORDER BY Salary DESC LIMIT 0,2
) a
Demo here
For second highest salary, This one work for me:
SELECT salary
FROM employee
WHERE salary
NOT IN (
SELECT MAX( salary )
FROM employee
ORDER BY salary DESC
)
LIMIT 1
This is awesome Query to find the nth Maximum:
For example: -
You want to find salary 8th row Salary, Just Changed the indexed value to 8.
Suppose you have 100 rows with Salary. Now you want to find Max salary for 90th row. Just changed the Indexed Value to 90.
set #n:=0;
select * from (select *, (#n:=#n+1) as indexed from employee order by Salary desc)t where t.indexed = 1;
with Common table expression
With cte as (
SELECT
ROW_NUMBER() Over (Order By Salary Desc) RowNumber,
Max(Salary) Salary
FROM
Employee
Group By Salary
)
Select * from cte where RowNumber = 2
without nested query
select max(e.salary) as max_salary, max(e1.salary) as 2nd_max_salary
from employee as e
left join employee as e1 on e.salary != e1.salary
group by e.salary desc limit 1;
Here change n value according your requirement:
SELECT top 1 amount
FROM (
SELECT DISTINCT top n amount
FROM payment
ORDER BY amount DESC ) AS temp
ORDER BY amount
This should work same :
SELECT MAX(salary) max_salary,
(SELECT MAX(salary)
FROM Employee
WHERE salary NOT IN
(SELECT MAX(salary)
FROM Employee)) 2nd_max_salary
FROM Employee
If we want to find Employee that gets 3nd highest salary then execute this query
SELECT a.employeeid,
a.salary
FROM (SELECT employeeid,
salary,
Dense_rank()
OVER(
ORDER BY salary) AS n
FROM employee) AS a
WHERE n = 3
What do you want
This will work To find the nth maximum number
SELECT
TOP 1 * from (SELECT TOP nth_largest_no * FROM Products Order by price desc) ORDER BY price asc;
For Fifth Largest number
SELECT
TOP 1 * from (SELECT TOP 5 * FROM Products Order by price desc) ORDER BY price asc;
Here is another solution which uses sub query but instead of IN clause it uses < operator
SELECT MAX(Salary) From Employees WHERE Salary < ( SELECT Max(Salary) FROM Employees);
select * from emp where sal =(select max(sal) from emp where eno in(select eno from emp where sal <(select max(sal)from emp )));
try the above code ....
if you want the third max record then add another nested query "select max(sal)from emp" inside the bracket of the last query and give less than operator in front of it.
select * from
Employees where Sal >=
(SELECT
max(Sal)
FROM
Employees
WHERE
Sal < (
SELECT
max(Sal)
FROM
Employees;
));
Max Salary:
select max(salary) from tbl_employee <br><br>
Second Max Salary:
select max(salary) from tbl_employee where salary < ( select max(salary) from tbl_employee);
Try below Query, was working for me to find Nth highest number salary.
Just replace your number with nth_No
Select DISTINCT TOP 1 salary
from
(Select DISTINCT TOP *nth_No* salary
from Employee
ORDER BY Salary DESC)
Result
ORDER BY Salary