2017-10-25 6 views
0

nur auf der Suche nach Informationen zu meinem Problem, nicht unbedingt die genaue Antwort.Abrufen verschiedener Werte in Zeilen und Gesamtanzahl

Ich habe eine Tabelle namens WorkDay.

In der Workday Tabelle gibt es 6 Felder:

Date_of_Workday, Workday_type, Boss, Regular, Tech1, Tech2. 

Mitarbeiter können zugewiesen mehrere Rollen werden und es gibt auch ein paar Felder, die NULL sind.

Ich möchte eine Abfrage schreiben, die die Gesamtzahl der jedem Arbeitstag zugewiesenen Mitarbeiter zurückgibt, aber natürlich, wenn ein Mitarbeiter der Boss-Rolle und auch der Tech2-Rolle zugewiesen ist, die nur als ein Mitarbeiter zählt.

EDIT: Dies ist meine gewünschte Ausgabe.

+------------+------------+----+ 
|Date_of_Work| Work_type | | 
+------------+------------+----+ 
| 2019-02-09 | AM   | 4 | 
| 2019-02-09 | PM   | 4 | 
| 2019-02-10 | AM   | 3 | 
| 2019-02-10 | PM   | 2 | 
| 2019-02-11 | AM   | 4 | 
| 2019-02-11 | PM   | 4 | 
| 2019-02-12 | AM   | 4 | 
| 2019-02-12 | PM   | 4 | 
| 2019-02-13 | AM   | 4 | 
| 2019-02-13 | PM   | 4 | 
------------+------------+---- 

Dies ist SELECT * FROM Workday:

+------------+------------+---------+----------+-----------+-----------+ 
| DateofWork | workday_typ | Boss | Regular | Tech1 | Tech2 | 
+------------+------------+---------+----------+-----------+-----------+ 
| 2019-02-09 | AM   | LB1  | AW1  | AE1  | JE1  | 
| 2019-02-09 | PM   | AE1  | IM1  | AL1  | BJ1  | 
| 2019-02-10 | AM   | AE1  | MM1  | MW1  | NULL  | 
| 2019-02-10 | PM   | AE1  | AE1  | EB1  | NULL  | 
| 2019-02-11 | AM   | LB1  | AB1  | DJ1  | JP1  | 
| 2019-02-11 | PM   | LB1  | JE1  | AB2  | BJ1  | 
| 2019-02-12 | AM   | LB1  | NS1  | AE1  | MB1  | 
| 2019-02-12 | PM   | LB1  | HP1  | EH1  | AL1  | 
| 2019-02-13 | AM   | LB1  | EB2  | ME1  | MM1  | 
| 2019-02-13 | PM   | LB1  | ME2  | AB2  | DJ1  | 
+------------+------------+---------+----------+-----------+-----------+ 

Ich bin nicht sicher, wie über diese Abfrage zu gehen. Alle Informationen/Zeiger würden sehr geschätzt werden.

+1

Haben Sie schon versucht, einen Code zu schreiben, um das zu erreichen? – Adam

+0

Es kann hilfreich sein, wenn Sie ein Beispiel des Tabelleninhalts bereitstellen. Was erscheint in diesen Feldern? Richtig und falsch? Gibt es auch eine Mitarbeitertabelle, die mit der Arbeitstagentabelle verknüpft ist? Wir benötigen mehr Details der relevanten Tabellen in Ihrer Datenbank. – Ambulare

+0

Die WorkDay-Tabelle verfügt über eine Employees-Tabelle, die verknüpft ist. Der PK ist Employee_Code, der in den Feldern Boss, Regular, Tech1 und Tech2 in der Tabelle WorkDay der FK ist. Jeder Mitarbeiter hat einen Mitarbeitercode, im Wesentlichen ihre Initialen mit einer Nummer. Ich kann die Ausgabe leicht erreichen, um den DISTINCT COUNT für jede Spalte anzuzeigen, wie die eindeutigen Werte in der Manager-Spalte usw., aber ich kann nicht jede einzelne Zeile zählen und sie zusammenfassen. – Eugeen

Antwort

1

Es sieht so aus, als ob Ihr bedauerlicherweise denormalisierter Tisch mehrere Spalten mit den Namen von Personen enthält. Sie möchten die Anzahl der eindeutigen Werte in allen diesen Spalten für jeden Tag zählen.

Versuchen Sie etwas wie das, um die einzigartigen Werte an jedem Tag zu erhalten. Dies gibt ein Ergebnis mit Date_of_Workday, Workday_Type, Person als Spalten zurück. Die Verwendung von UNION eliminiert doppelte Werte von Person.

  SELECT Date_of_Workday, Workday_Type, Boss AS Person FROM tbl 
      UNION 
      SELECT Date_of_Workday, Workday_Type, Regular AS Person FROM tbl 
      UNION 
      SELECT Date_of_Workday, Workday_Type, Tech1 AS Person FROM tbl 
      UNION 
      SELECT Date_of_Workday, Workday_Type, Tech2 AS Person FROM tbl 

verwenden dann diese Unterabfrage in einer aggregierten Abfrage wie folgt: (http://sqlfiddle.com/#!9/f1320a/1/0)

SELECT Date_of_Workday, Workday_Type, COUNT(Person) AS PersonCount 
    FROM (
      SELECT Date_of_Workday, Workday_Type, Boss AS Person FROM tbl 
      UNION 
      SELECT Date_of_Workday, Workday_Type, Regular AS Person FROM tbl 
      UNION 
      SELECT Date_of_Workday, Workday_Type, Tech1 AS Person FROM tbl 
      UNION 
      SELECT Date_of_Workday, Workday_Type, Tech2 AS Person FROM tbl 
     ) Persons 
GROUP BY Date_of_Workday, Workday_Type 

Sie benötigen COUNT(Person) statt COUNT(*) hier, sonst wird es NULL Werte zählen und daher overcount Menschen.

+0

Vielen Dank! Lief wie am Schnürchen. Kann ich nur fragen: Woher weiß MySQL, was Personen sind? Es gibt keine Definition oder irgendetwas. Soweit ich sehen kann, haben Sie in diesem Beispiel SELECT (Felder) FROM (Argumente) Personen gesetzt. Es funktioniert, aber ich bin mir nicht sicher, was die Personen sind. – Eugeen

+0

'Personen' ist ein Alias ​​für die Unterabfrage, der direkt nach der schließenden Klammer deklariert wird. Wenn Sie 'SELECT FROM (einige Unterabfragen) Alias' sagen, müssen Sie der Unterabfrage einen' Alias'-Namen geben oder SQL wird es nicht nehmen.Sie können einen beliebigen Namen verwenden. –

+0

Sie haben "union" in der Unterabfrage verwendet, so dass doppelte Zeilen automatisch entfernt werden, wenn ein Mitarbeiter sowohl als Boss als auch als Tech 1 zugewiesen wird. Habe ich Recht? –

Verwandte Themen