2017-04-06 4 views
1

Ein Mitarbeiter beteiligt ist in einer Woche bis zu 3 Projekte in und in jedem dieser Projekte kann der Mitarbeiter zwei unterschiedliche Aufgaben. Ich benutze Union alle, um separate Felder aus einer einzigen Tabelle zu verbinden, so dass ich eine separate Zeile für jede Aufgabe erhalten (bis zu 6 Zeilen pro Mitarbeiter). Dies wird schließlich mit der Uhr im System verbunden, so dass der Betrag, den wir jedem Angestellten zahlen, bestimmten Aufgaben in bestimmten Projekten zugewiesen werden kann, damit wir besser verfolgen können, wohin das Geld fließt.Graf mit Vereinigung aller

ich benötige ein Mittel, um die Menge an Aufgaben zu zählen (also die Anzahl der Zeilen zu zählen für jeden Mitarbeiter) so Ich habe eine Reihe von zu unterteilen.

Ich habe versucht eine Gruppe von und an mehreren Orten zu zählen, aber es zeigt nur 1 (vermutlich weil es kein eindeutiges Feld innerhalb der Auswahl gibt (jede Zeile ist einzigartig, aber das scheint nicht zu helfen?)).

Soll ich tun die Zählung auf einem bestimmten Feld sein? oder gibt es einen anderen Weg?

Current SQL-Abfrage

DECLARE @WeekCommencing date = '2017-04-03' 

select SageID, a.EmployeeID, a.ProjectID, a.TaskID, a.FlatRate, a.PayRate from 
( Select distinct Employee.SageID, EmployeeProject.EmployeeID, EmployeeProject.ProjectID, EmployeeProject.TaskID, Employee.FlatRate, Employee.PayRate from 
    ( Select EmployeeID, ProjectID1 as ProjectID, Project1TaskID1 as TaskID, WeekCommencing 
     FROM ProjectEmployee 
     WHERE ProjectID1 is not null and Project1TaskID1 is null 
      union all 
     Select EmployeeID, ProjectID1 as ProjectID, Project1TaskID1 as TaskID, WeekCommencing 
     FROM ProjectEmployee 
     WHERE ProjectID1 is not null and Project1TaskID1 is not null  
      union all 
     Select EmployeeID, ProjectID1 as ProjectID, Project1TaskID2 as TaskID, WeekCommencing 
     FROM ProjectEmployee 
     WHERE ProjectID1 is not null and Project1TaskID2 is not null 
      union all 
     Select EmployeeID, ProjectID2 as ProjectID, Project2TaskID1 as TaskID, WeekCommencing 
     FROM ProjectEmployee 
     WHERE ProjectID2 is not null and Project2TaskID1 is null 
      union all 
     Select EmployeeID, ProjectID2 as ProjectID, Project2TaskID1 as TaskID, WeekCommencing 
     FROM ProjectEmployee 
     WHERE ProjectID2 is not null and Project2TaskID1 is not null  
      union all 
     Select EmployeeID, ProjectID2 as ProjectID, Project2TaskID2 as TaskID, WeekCommencing 
     FROM ProjectEmployee 
     WHERE ProjectID2 is not null and Project2TaskID2 is not null   
      union all 
     Select EmployeeID, ProjectID3 as ProjectID, Project3TaskID1 as TaskID, WeekCommencing 
     FROM ProjectEmployee 
     WHERE ProjectID3 is not null and Project3TaskID1 is null 
      union all 
     Select EmployeeID, ProjectID3 as ProjectID, Project3TaskID1 as TaskID, WeekCommencing 
     FROM ProjectEmployee 
     WHERE ProjectID3 is not null and Project3TaskID1 is not null  
      union all 
     Select EmployeeID, ProjectID3 as ProjectID, Project3TaskID2 as TaskID, WeekCommencing 
     FROM ProjectEmployee 
     WHERE ProjectID3 is not null and Project3TaskID2 is not null  
    ) as EmployeeProject 

    inner join 
    Employee on EmployeeProject.EmployeeID = Employee.EmployeeID 
    where WeekCommencing = @WeekCommencing 
) as a 

inner join 

( Select ProjectEmployeeID, EmployeeID from -- remove duplicates if info is inserted multiple times 
    ( Select ProjectEmployeeID, EmployeeID, ROW_NUMBER() OVER(PARTITION BY EmployeeID ORDER BY ProjectEmployeeID DESC) EmployeeDup 
     FROM ProjectEmployee 
    ) a 
    WHERE EmployeeDup = 1 
) as c 

on a.EmployeeID = c.EmployeeID 

Order by a.flatrate, a.SageID 

Stromwerte in der ProjectEmployee Tabelle Current Values in the ProjectEmployee table Stromausgabe von oben Abfrage Current Output from above query

I hinzufügen sollte - der gewünschte Ausgang das gleiches wie das zweite Bild (oberhalb), aber mit einer zusätzlichen Spalte namens Linecount

LineCount 
5 
5 
5 
5 
5 
2 
2 
1 
2 
2 
+0

Bitte, https://stackoverflow.com/help/mcve lesen. – jarlh

+0

Warum haben Sie Abfragen mit WHERE ProjectID1 ist nicht null und Project1TaskID1 ist null' und WHERE ProjectID1 nicht null ist und Project1TaskID1 ist nicht null'. Enthält eine Abfrage mit WHERE ProjectID1 nicht null alle Fälle in diesem Szenario? – Jens

+0

Ich denke, Sie haben einige Union alle in Ihrer Abfrage wiederholt ... Darüber hinaus wäre es sehr nützlich, wenn Sie einige Beispieldaten (CREATE und INSERT-Skripte) – etsa

Antwort

0

Ist das wonach Sie suchen?

habe ich COUNT(*) OVER (PARTITION BY SAGEID, A.EmployeeID) AS RC und modifiziert, um die UNION ALL wie Jean zu

vorgeschlagen
DECLARE @WeekCommencing date = '2017-04-03' 

select SageID, a.EmployeeID, a.ProjectID, a.TaskID, a.FlatRate, a.PayRate, COUNT(*) OVER (PARTITION BY SAGEID, A.EmployeeID) AS RC 
from ( Select distinct Employee.SageID, EmployeeProject.EmployeeID, EmployeeProject.ProjectID, EmployeeProject.TaskID, Employee.FlatRate, Employee.PayRate 
     from (  
      Select EmployeeID, ProjectID1 as ProjectID, Project1TaskID1 as TaskID, WeekCommencing 
      FROM ProjectEmployee 
      WHERE ProjectID1 is not null 
       union all 
      Select EmployeeID, ProjectID1 as ProjectID, Project1TaskID2 as TaskID, WeekCommencing 
      FROM ProjectEmployee 
      WHERE ProjectID1 is not null and Project1TaskID2 is not null 
       union all 
      Select EmployeeID, ProjectID2 as ProjectID, Project2TaskID1 as TaskID, WeekCommencing 
      FROM ProjectEmployee 
      WHERE ProjectID2 is not null 
       union all 
      Select EmployeeID, ProjectID2 as ProjectID, Project2TaskID2 as TaskID, WeekCommencing 
      FROM ProjectEmployee 
      WHERE ProjectID2 is not null and Project2TaskID2 is not null   
       union all 
      Select EmployeeID, ProjectID3 as ProjectID, Project3TaskID1 as TaskID, WeekCommencing 
      FROM ProjectEmployee 
      WHERE ProjectID3 is not null 
       union all 
      Select EmployeeID, ProjectID3 as ProjectID, Project3TaskID2 as TaskID, WeekCommencing 
      FROM ProjectEmployee 
      WHERE ProjectID3 is not null and Project3TaskID2 is not null   
      ) AS EMPLOYEEPROJECT 
     INNER JOIN EMPLOYEE ON EMPLOYEEPROJECT.EMPLOYEEID = EMPLOYEE.EMPLOYEEID 
     WHERE WeekCommencing = @WeekCommencing 
    ) AS A 
INNER JOIN (SELECT ProjectEmployeeID, EmployeeID 
      from -- remove duplicates if info is inserted multiple times 
      ( Select ProjectEmployeeID, EmployeeID, ROW_NUMBER() OVER(PARTITION BY EmployeeID ORDER BY ProjectEmployeeID DESC) EmployeeDup 
       FROM ProjectEmployee 
      ) a 
      WHERE EmployeeDup = 1 
      ) AS C ON A.EMPLOYEEID = C.EMPLOYEEID  
Order by a.flatrate, a.SageID 
+0

Der Graf ist genau richtig, was ich wollte. Ich sehe, was du meinst über die Gewerkschaft alls, ich kann eine entfernen, aber nicht die, die Sie vorgeschlagen Jemand kann an einem Projekt arbeiten und nur eine Art von Aufgabe für die ganze Woche ausführen, oder jemand kann an einem Projekt arbeiten und 2 Arten von Aufgaben ausführen, aber sie können nicht an einem Projekt arbeiten und keine Aufgaben erledigen. – hero9989

+0

Ich habe die UNION korrigiert wie Jens vorgeschlagen hat – etsa