2016-11-16 4 views
0

Es gibt 2 Tabellen: -
Die Mitarbeiter-Tabelle enthält alle Mitarbeiter.Erhalten Sie Top-3 Gehälter spaltenweise Abteilung in Mitarbeiter Tabelle?

+----+-------+--------+--------------+ 
| Id | Name | Sa1ary | DepartmentId | 
+----+-------+--------+--------------+ 
| 1 | Joe | 70000 |   1 | 
| 2 | Henry | 80000 |   2 | 
| 3 | Sam | 60000 |   2 | 
| 4 | Max | 90000 |   3 | 
| 5 | Janet | 69000 |   4 | 
| 6 | Randy | 85000 |   1 | 
+----+-------+--------+--------------+ 

Abteilung Tabelle ist wie folgt: -

+----+------------+  
|DID | DNAME  | 
+----+------------+ 
|1 | IT  | 
|2 | ADMIN  | 
|3 | HR  | 
|4 | MARKETING | 
|5 | SALES  | 
+----+------------+ 

ausgegeben werden soll: -

+-----+--------+--------+------+------+ 
|Dname| Best |Seond best | Worst | 
+-----+--------+--------+------+------+ 
|IT | 40000 |30000 |10000  | 
+-----+--------+--------+------+------+  
|ADMIN| 50000 | |50000  | 
+-----+--------+--------+------+------+ 
|HR | 70000 |60000 |60000  | 
+-----+--------+--------+------+------+ 

haben wir maximal zu berücksichtigen, zweites Maximum und 3 maximales Gehalt von jeder Abteilung.

+1

Welche Datenbank verwenden Sie? –

+0

Die angegebene Ausgabe scheint mit den angegebenen Eingabetabellen nicht konsistent zu sein. Könnten Sie bitte nachsehen? Auch, was ist das Kriterium von "am besten schlechtesten"; Säule? 3. beste? wenn nur ein Mitarbeiter in einer Abteilung anwesend ist. ist das beste und das "beste schlechteste", das in der Ausgabe erwartet wird, oder die Spalte "am schlechtesten" wird voraussichtlich null sein? Bitte aktualisieren Sie die Details ist die Frage. – GurV

+0

Sie können MySQL als Datenbank verwenden. –

Antwort

0
CREATE TABLE #Table1(Id INT, Name VARCHAR(100), Salary INT, DepartmentId INT) 
CREATE TABLE #Table2(DID INT, DNAME VARCHAR(100)) 

INSERT INTO #Table1(Id , Name , Salary , DepartmentId) 
SELECT 1,'Joe',70000,1 UNION ALL 
SELECT 2,'Henry',80000,2 UNION ALL 
SELECT 3,'Sam',60000,2 UNION ALL 
SELECT 4,'Max',90000,3 UNION ALL 
SELECT 5,'Janet',69000,4 UNION ALL 
SELECT 6,'Randy',85000,1 

INSERT INTO #Table2(DID , DNAME) 
SELECT 1,'IT' UNION ALL 
SELECT 2,'ADMIN' UNION ALL 
SELECT 3,'HR' UNION ALL 
SELECT 4,'MARKETING' UNION ALL 
SELECT 5,'SALES' 

;WITH CTE AS 
(
SELECT *,(SELECT COUNT(*) FROM #Table1 WHERE e.salary <= salary AND departmentID=e.departmentID) AS RowNo FROM #Table1 e 
) 
SELECT * 
FROM 
( 
SELECT DNAME,salary,CASE WHEN RowNo = 1 THEN 'Best' WHEN RowNo = 2 THEN 'Seond' WHEN RowNo = 3 THEN 'Best Worst' END RowNo 
FROM CTE 
JOIN #Table2 ON DID = DepartmentId 
WHERE RowNo <= 3 
)A 
PIVOT 
(
    MAX(salary) FOR RowNo IN ([Best],[Seond],[Best Worst]) 
) PVT 
+0

["Antworten auf Fragen, die mit' sql' gekennzeichnet sind, sollten den ISO/IEC-Standard SQL verwenden. "] (Http://stackoverflow.com/tags/sql/info) – onedaywhen

+0

Vielen Dank ... –

0

auf SQL Server Sie SQL Row_Number function with Partition By Klausel Zeilen verwenden können, um Rang nach einem Wert in einer Gruppe auf einer ausgewählten Spalte basierend

habe ich auch CTE Expression und Operator GROUP BY

;with cte as (
select 
    Dname, Sa1ary, ROW_NUMBER() Over (Partition By d.DId Order By Sa1ary desc) rn 
from employee e 
inner join department d on e.DepartmentId = d.DId 
) 
select 
    dname, 
    max(Best) Best, 
    max(Seond) Seond, 
    max("Best Worst") "Best Worst" 
from (
select 
    Dname, 
    case when rn = 1 then Sa1ary else null end as Best, 
    case when rn = 2 then Sa1ary else null end as Seond, 
    case when rn = 3 then Sa1ary else null end as "Best Worst" 
from cte 
) t 
group by dname 

Bitte beachten Sie, dass die Ergebnisse nicht so sind, wie Sie gezeigt haben, da ist ein Fehler, denke ich.

enter image description here Bitte testen Sie die oben, ich hoffe, es hilft,

+0

Danke für die Lösung .. es half wirklich –

0

unten versuchen Pivot-Abfrage.

  select * from 
      (
      select DName,salary,Class from 
      (
      select 
      *, 
      case when RID='1' then 'Best' 
      when RID='2' then 'second' 
      when RID='3' then 'Best Worst' 
      else 
      NULL 
      end as CLASS 
      from (
      select DID,Dname,salary ,  
      ROW_NUMBER() OVER (PARTITION BY Dname ,DID 
      ORDER BY salary DESC ) as RID 
      from 
      #Employee E inner join #Department D on E.DepartmentId=d.DID 
      )a 
      where rid <4 
      )b 
      ) as x 
      pivot(
      max(salary) for class in ([Best],[Second],[Best Worst]) 
      ) 
      as pivot1 
+0

Danke für die Lösung .. –

+0

@abdulgaffar Mark Antwort, wenn es für Sie arbeitet –

Verwandte Themen