2017-04-27 1 views
0

In SQL Server 2008 habe ich eine Tabelle tblStock mit 5 Spalten:Anzeige alle Mitarbeiter unter jeder Manager mit Rolle

-Manager, Mitarbeiter, Wert1, Wert2, Wert3.

Beispieldaten werden,

enter image description here

ich den Code unten geschrieben haben, die obige Beispiel-Ausgabe zu erhalten:

IF OBJECT_ID('tempdb..#tblDepartment') IS NOT NULL DROP TABLE #tblDepartment 

SELECT * INTO #tblDepartment 
FROM 
(
    SELECT 'Theva' Manager, 'Lawlrence' Employee, 10 Value1, 20 Value2, 60 Value3 
    UNION ALL 
    SELECT 'Theva', 'David', 20, 35, 42 
    UNION ALL 
    SELECT 'Theva', 'Ragav', 45, 35, 86 
    UNION ALL 
    SELECT 'Prem', 'Vino', 69, 99, 45 
    UNION ALL 
    SELECT 'Prem', 'Lara', 27, 99, 45 
    UNION ALL 
    SELECT 'Anzal', 'Ranjani', 65, 55, 12 
    UNION ALL 
    SELECT 'Anzal', 'Priya', 55, 47, 89 
    UNION ALL 
    SELECT 'Anzal', 'Vinoth', 98, 53, 56 
    UNION ALL 
    SELECT 'Rafeek', 'Ashok', 48, 75, 45 
)TAB 

Select * from #tblDepartment 

ich die folgende Ausgabe aus der obigen Tabelle erhalten möchten,

enter image description here

In dieser Ausgabe, die ich erwähnte grüne Farbe Zeile ist die Summe der Mitarbeiter, die bestimmten Manager gehört.

Wer kennt die Lösung dafür.

+0

Was Sie bisher versucht haben? – SchmitzIT

+0

Ich habe eine Abfrage geschrieben, um die Ausgabe zu erhalten. Ich weiß nicht, wie ich diesen Tabellen beitreten soll. Select a.Employee, a.Value1, a.Value2, a.Value3 aus #tblDepartment a Exklusionsverknüpfung #tblDepartment b auf a.Manager = b.Manager Select a.Manager, SUM (a.Value1) Als Wert1, SUM (a.Wert2) Als Wert2, SUM (a.Wert3) Als Wert3 aus #tblDepartment ein innerer Join #tblDepartment b auf a.Manager = b.Manager Gruppe von a.Manager –

+0

@ThevaDeva bitte hinzufügen irgendwelche Fragen zu der Frage, nicht als Kommentare.Auf diese Weise werden alle Informationen an einem Ort gruppiert und nicht über den Ort verstreut. Bitte fügen Sie auch hinzu, was nicht funktioniert, welche Fehler Sie möglicherweise erhalten haben oder warum es nicht das erwartete Ergebnis generiert. – SchmitzIT

Antwort

2

Ein anderer Weg, um Ihr Ergebnis

WITH mCTE AS (
    SELECT a.Manager, a.Manager AS Employee, 'Manager' AS Role, SUM(a.Value1) AS Value1, SUM(a.Value2) AS Value2, SUM(a.Value3) AS Value3, 1 AS r 
    FROM #tblDepartment AS a 
    GROUP BY a.Manager 

    UNION ALL 

    SELECT a.Manager, a.Employee, 'Employee' AS Role, a.Value1, a.Value2, a.Value3, 2 AS r 
    FROM #tblDepartment AS a 
) 

SELECT Employee, Role, Value1, Value2, Value3 
FROM mCTE 
ORDER BY Manager, r 
+1

Wie ist das anders? Sie haben die abgeleitete Tabelle einfach in ein CTE geändert. Das ist kein großer Unterschied ... –

+0

Danke Zohar. Es funktioniert gut –

2

ist hier eine Möglichkeit, es zu tun:

SELECT Name, Role, Value1, Value2, Value3 
FROM 
(
SELECT Manager As Name, 
     'Manager' As Role, 
     SUM(Value1) As Value1, 
     SUM(Value2) AS Value2, 
     SUM(Value3) AS Value3, 
     Manager 
FROM #tblDepartment 
GROUP BY Manager 

UNION ALL 

SELECT Employee As Name, 
     'Employee' As Role, 
     Value1, 
     Value2, 
     Value3, 
     Manager 
FROM #tblDepartment 
) t 
ORDER BY Manager,Role DESC, Name 

Es ist nicht genau die gleiche Reihenfolge wie bei Ihnen, aber die Mitarbeiter unter dem richtigen Manager sind.

See a live demo on rextester.

+0

Hinzufügen von 'role desc' in der 'order by'-Klausel würde passend erscheinen. – Hexxx

+0

@Hexxx ''role desc' würde alle Manager zusammen oder alle Mitarbeiter zusammenbringen. Ich denke, dass OP die Angestellten braucht, um direkt unter dem Manager –

+0

@BennjoeMordeno zu erscheinen, indem ich hinzufüge, dass ich meinte, – Hexxx

1

Dies ist die am nächsten zu Ihrem Ergebnis zu erhalten, Ihre Bestellung auch unter Berücksichtigung

select Name, Role, Value1, Value2, Value3 
from (
     select t.MgrId, t.manager as Name, 'Manager' as Role, sum(t.Value1) Value1, sum(t.Value2) Value2, sum(t.Value3) Value3 
     from (select *, dense_rank() OVER(ORDER BY Manager desc) AS MgrId from #tblDepartment) t 
     group by t.MgrId, t.manager 

     union all 

     select t.MgrId, t.employee as Name, 'Employee' as Role, sum(t.Value1) Value1, sum(t.Value2) Value2, sum(t.Value3) Value3 
     from (select *, dense_rank() OVER(ORDER BY Manager desc) AS MgrId from #tblDepartment) t 
     group by t.MgrId, t.employee 
    ) t 
order by t.MgrId, t.Role desc 

Sie können eine funktionierende Version here überprüfen. Die Ranking-Funktionen sind ab SQL Server 2008 verfügbar und sollten auch für Sie funktionieren.

+0

Nein. Mitarbeiterzeilen sollten nicht die Summe der Werte enthalten. –

+0

Eigentlich ist das nicht die Summe aller Werte, das ist die Summe für den einzigen Mitarbeiter. Nur für Manager wird die Funktion SUM() verschiedene Werte zusammenfassen. In der Mitarbeitergruppe wird es nur für die Gruppierung pro Manager-ID verwendet, es ist immer noch der Wert für jeden Mitarbeiter. Überprüfen Sie einfach die Demo :) –

+0

Richtig, ich habe die Gruppe von Mitarbeiter auf der zweiten Abfrage verpasst. Ich denke jedoch, dass es Dinge überkompensiert, seit eine Gruppe hinzugefügt wurde, wodurch die Reihenfolge der Ergebnisse nicht wirklich geändert wird. Nur Unterschied im Ergebnis Ihrer Qurey und meine Abfrage ist die Reihenfolge der Manager (asc sv desc) –

1

versuchen Sie dies:

declare @tb table(manager varchar(50),employee varchar(50), value1 int,value2 int,value3 int) 
insert into @tb 
SELECT 'Theva' Manager, 'Lawlrence' Employee, 10 Value1, 20 Value2, 60 Value3 
    UNION ALL 
    SELECT 'Theva', 'David', 20, 35, 42 
    UNION ALL 
    SELECT 'Theva', 'Ragav', 45, 35, 86 
    UNION ALL 
    SELECT 'Prem', 'Vino', 69, 99, 45 
    UNION ALL 
    SELECT 'Prem', 'Lara', 27, 99, 45 
    UNION ALL 
    SELECT 'Anzal', 'Ranjani', 65, 55, 12 
    UNION ALL 
    SELECT 'Anzal', 'Priya', 55, 47, 89 
    UNION ALL 
    SELECT 'Anzal', 'Vinoth', 98, 53, 56 
    UNION ALL 
    SELECT 'Rafeek', 'Ashok', 48, 75, 45 

    select case when len(employee)>0 then employee else a.manager end as Name,case when len(employee)>0 then 'Employee' else 'Manager' end as [Role],b.value1,b.value2,b.value3 from 
    (select distinct manager,'Manager' as Role from @tb 
    union all 
    select employee,'employee' as Role from @tb) as a 



    left join 


    (select distinct a.manager,employee,value1,value2,value3 from 
    (select manager,'' as employee,sum(value1)value1,sum(value2)value2,sum(value3)value3 from @tb group by manager 
    union all 
    select a.manager,b.employee,b.value1,b.value2,b.value3 from 
    (select manager,sum(value1)value1,sum(value2)value2,sum(value3)value3 from @tb group by manager) as a 
    left join 
    (select * from @tb) as b 
    on a.manager = b.manager) as a) as b 
    on a.manager = b.manager where value1 is not null 

Ergebnis:

Anzal Manager  218 155 157 
Priya Employee 55 47 89 
Ranjani Employee 65 55 12 
Vinoth Employee 98 53 56 
Prem Manager  96 198 90 
Lara Employee 27 99 45 
Vino Employee 69 99 45 
Rafeek Manager  48 75 45 
Ashok Employee 48 75 45 
Theva Manager  75 90 188 
David Employee 20 35 42 
Lawlrence Employee 10 20 60 
Ragav Employee 45 35 86 
+0

Diese Frage ist ein gutes Beispiel für die Schüler. –

1

kann dies nicht die gewünschte Antwort der OP habe ich versucht, es SQL 2012 mit neu erstellen und das ist Bin ich komme.

IF OBJECT_ID('tempdb..#tblDepartment') IS NOT NULL DROP TABLE #tblDepartment 

    SELECT * INTO #tblDepartment 
    FROM 
    (
     SELECT 'Theva' Manager, 'Lawlrence' Employee, 10 Value1, 20 Value2, 60 Value3 
     UNION ALL 
     SELECT 'Theva', 'David', 20, 35, 42 
     UNION ALL 
     SELECT 'Theva', 'Ragav', 45, 35, 86 
     UNION ALL 
     SELECT 'Prem', 'Vino', 69, 99, 45 
     UNION ALL 
     SELECT 'Prem', 'Lara', 27, 99, 45 
     UNION ALL 
     SELECT 'Anzal', 'Ranjani', 65, 55, 12 
     UNION ALL 
     SELECT 'Anzal', 'Priya', 55, 47, 89 
     UNION ALL 
     SELECT 'Anzal', 'Vinoth', 98, 53, 56 
     UNION ALL 
     SELECT 'Rafeek', 'Ashok', 48, 75, 45 
    )TAB 

    DECLARE @T AS TABLE 
     (
      ID INT IDENTITY(1, 1) 
       PRIMARY KEY , 
      NAME VARCHAR(50) , 
      Role VARCHAR(50) , 
      Value1 INT , 
      Value2 INT , 
      Value3 INT 
     ); 
    WITH CTE 
       AS (SELECT Manager , 
          Employee , 
          SUM(Value1) AS Value1 , 
          SUM(Value2) AS Value2 , 
          SUM(Value3) AS Value3 
        FROM  #tblDepartment 
        GROUP BY Manager , 
          Employee 
          WITH ROLLUP 
       ) 
     INSERT INTO @T 
       (NAME, Role, Value1, Value2, Value3) 
    SELECT Name , 
      Role , 
      Value1 , 
      Value2 , 
      Value3 
    FROM (SELECT ISNULL(Employee, Manager) NAME , 
         IIF(Employee IS NULL, 'Manager', 'Employee') ROLE , 
         Value1 , 
         Value2 , 
         Value3 
       FROM  CTE 
      ) T 
    WHERE t.NAME IS NOT NULL 

    SELECT Name , 
      Role , 
      Value1 , 
      Value2 , 
      Value3 FROM @T 
    ORDER BY ID DESC 

Ergebnis:

 Name     Role    Value1  Value2  Value3 
     --------------------- ------------------ ----------- ----------- ----------- 
     Theva     Manager   75   90   188 
     Ragav     Employee   45   35   86 
     Lawlrence    Employee   10   20   60 
     David     Employee   20   35   42 
     Rafeek    Manager   48   75   45 
     Ashok     Employee   48   75   45 
     Prem     Manager   96   198   90 
     Vino     Employee   69   99   45 
     Lara     Employee   27   99   45 
     Anzal     Manager   218   155   157 
     Vinoth    Employee   98   53   56 
     Ranjani    Employee   65   55   12 
     Priya     Employee   55   47   89 
Verwandte Themen