2016-09-09 3 views
-1

Ich habe zwei MYSQL Tabellen. Diese heißen wie folgt: attendance_summary, attendance_summary_cecb. Beide Tabellen haben die gleichen Felder, können jedoch unterschiedliche Daten enthalten.Wie kann ich diese SELECT-Abfrage in MySQL erstellen?

Dies sind die Ergebnisse der Monat August 2016 von diesen beiden Tabellen.

mysql> SELECT emp_id, date, days, ot_days, ot_hours FROM attendance_summary; 
+--------+------------+------+---------+----------+ 
| emp_id | date  | days | ot_days | ot_hours | 
+--------+------------+------+---------+----------+ 
|  4 | 2016-08-01 | 10 |  0 |  20.0 | 
|  4 | 2016-08-16 | 13 |  0 |  14.5 | 
|  12 | 2016-08-01 | 12 |  0 |  10.0 | 
|  12 | 2016-08-16 | 11 |  2 |  16.5 | 
|  14 | 2016-08-01 | 12 |  2 |  15.0 | 
|  14 | 2016-08-16 | 10 |  0 |  16.0 | 
|  15 | 2016-08-01 | 11 |  0 |  16.0 | 
|  15 | 2016-08-16 | 9 |  3 |  21.0 | 
+--------+------------+------+---------+----------+ 
8 rows in set (0.00 sec) 

mysql> SELECT emp_id, date, days, ot_days, ot_hours FROM attendance_summary_cecb; 
+--------+------------+------+---------+----------+ 
| emp_id | date  | days | ot_days | ot_hours | 
+--------+------------+------+---------+----------+ 
|  4 | 2016-08-01 | 15 |  0 |  20.0 | 
|  4 | 2016-08-16 | 10 |  0 |  12.0 | 
|  12 | 2016-08-01 | 12 |  1 |  10.0 | 
|  12 | 2016-08-16 | 11 |  2 |  16.5 | 
|  14 | 2016-08-01 | 12 |  2 |  15.0 | 
|  14 | 2016-08-16 | 10 |  0 |  16.0 | 
|  15 | 2016-08-01 | 10 |  0 |  16.0 | 
|  15 | 2016-08-16 | 9 |  0 |  21.0 | 
+--------+------------+------+---------+----------+ 
8 rows in set (0.00 sec) 

Mit Hilfe dieser beiden Tabellen in einer einzigen Abfrage, ich brauche

> From `attendance_summary` 
> - Total Days 
> - Total OT Days 
> - Total OT Hours 
> 
> From `attendance_summary_cecb` 
> - Total Days 
> - Total OT Days 
> - Total OT Hours 

Dies ist zu bekommen, wie ich es versucht:

SELECT e.emp_id 
    , e.full_name 
    , MAX(days1) as days1 
    , MAX(ot_days1) as ot_days1 
    , MAX(ot_hours1) as ot_hours1 
    , MAX(days2) as days2 
    , MAX(ot_days2) as ot_days2 
    , MAX(ot_hours2) as ot_hours2 
    , SUM(days1+days2) AS olekma_days 
    , SUM(ot_days1+ot_days2) AS olekma_ot_days 
    , SUM(ot_hours1+ot_hours2) AS olekma_ot_hours  
    , SUM(days3+days4) AS cecb_days 
    , SUM(ot_days3+ot_days4) AS cecb_ot_days 
    , SUM(ot_hours3+ot_hours4) AS cecb_ot_hours   
FROM 
     (
     SELECT emp_id 
      , CASE DAY(date) WHEN 1 THEN days ELSE 0 END as days1 
      , CASE DAY(date) WHEN 1 THEN ot_days ELSE 0 END as ot_days1 
      , CASE DAY(date) WHEN 1 THEN ot_hours ELSE 0 END as ot_hours1 
      , CASE DAY(date) WHEN 16 THEN days ELSE 0 END as days2 
      , CASE DAY(date) WHEN 16 THEN ot_days ELSE 0 END as ot_days2 
      , CASE DAY(date) WHEN 16 THEN ot_hours ELSE 0 END as ot_hours2 
     FROM attendance_summary 
     WHERE MONTH(date) = 08 AND YEAR(date) = 2016 

     UNION 

     SELECT emp_id 
     , CASE DAY(date) WHEN 1 THEN days ELSE 0 END as days3 
     , CASE DAY(date) WHEN 1 THEN ot_days ELSE 0 END as ot_days3 
     , CASE DAY(date) WHEN 1 THEN ot_hours ELSE 0 END as ot_hours3 
     , CASE DAY(date) WHEN 16 THEN days ELSE 0 END as days4 
     , CASE DAY(date) WHEN 16 THEN ot_days ELSE 0 END as ot_days4 
     , CASE DAY(date) WHEN 16 THEN ot_hours ELSE 0 END as ot_hours4 
     FROM attendance_summary_cecb 
     WHERE MONTH(date) = 08 AND YEAR(date) = 2016 
     ) as s 
LEFT JOIN employees e USING (emp_id) 
INNER JOIN categories c ON c.id = e.category_id AND c.salary_type = 'D' 
WHERE e.category_id = 6 
GROUP BY e.emp_id\G 

UPDATE: Dies ist Tabellenstruktur für diese zwei Tabellen:

CREATE TABLE `attendance_summary` (
    `as_id` INT(11) NOT NULL AUTO_INCREMENT, 
    `emp_id` INT(11) NOT NULL, 
    `date` DATE NOT NULL DEFAULT '1901-01-01', 
    `days` INT(11) NOT NULL, 
    `ot_days` INT(11) NULL, 
    `ot_hours` DECIMAL(16,1) NULL, 
    PRIMARY KEY (`as_id`), 
    UNIQUE KEY (emp_id, `date`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE `attendance_summary_cecb` (
    `as_id` INT(11) NOT NULL AUTO_INCREMENT, 
    `emp_id` INT(11) NOT NULL, 
    `date` DATE NOT NULL DEFAULT '1901-01-01', 
    `days` INT(11) NOT NULL, 
    `ot_days` INT(11) NULL, 
    `ot_hours` DECIMAL(16,1) NULL, 
    PRIMARY KEY (`as_id`), 
    UNIQUE KEY (emp_id, `date`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

Aber es funktioniert nicht für mich. Hoffe jemand kann mir helfen.

+0

Und wollen Sie uns erraten, was schief gegangen ist oder gehen Sie um es mit uns zu teilen? – Shadow

+0

@Shadow, ich habe einen Fehler wie 'ERROR 1054 (42S22): Unbekannte Spalte 'Tage3' in 'Feldliste'' – user3733831

+0

weil Sie einen Tippfehler in der zweiten Hälfte der Union – Drew

Antwort

0

Die Antwort auf Ihre Frage ist ziemlich einfach. Übrigens musste ich 2 fehlende Tabellen von unten erstellen, um den Fehler zu bestätigen.

Wenn Sie tun, um eine

select col1, col2 from t1 
union 
select col9 as fred, col11 as john from t2 

oder eine Variation dieses Themas mit Unmengen von Tabellen, die nur Spaltennamen, die zurück kommen, sind aus dem ersten Mitglied der Vereinigung.

Mit anderen Worten, Fred und John kommen nicht heraus.

So sind Ihre days3 und days4 aus der abgeleiteten Tabelle s nicht verfügbar.

Sie müssen es dann zu überdenken, aber das beantwortet die Frage: p

aus dem Handbuch MySQL Seite UNION Syntax dem Titel:

Die Spaltennamen aus der ersten SELECT-Anweisung als die Spalte verwendet Namen für die zurückgegebenen Ergebnisse. Ausgewählte Spalten, die in aufgelistet sind, die entsprechenden Positionen jeder SELECT-Anweisung sollten den gleichen -Datentyp haben. (Zum Beispiel ist die erste von der ersten Anweisung ausgewählte Spalte sollte den gleichen Typ wie die erste Spalte von den anderen Aussagen ausgewählt haben.)

Verwandte Themen