2016-07-09 9 views
-4

Ich habe 2 TabellenWie zwei Tabellen zu kombinieren, die unterschiedliche Daten haben

  1. tbl_vacancies_details
  2. tbl_filled_vacancies

ich zeigen möchte ein Diagramm, das die Gesamtzahl der offenen Stellen und gefüllt zählt in jeder enthält Jahr. Wie kann ich eine SQL-Abfrage dafür schreiben?

tbl_vacancies_details 

    Id | Year  | Count | 
    ------------------------ 
    1 | Jan-2014 | 10 | 
    2 | Jun-2014 | 5 | 
    3 | Dec-2015 | 9 | 

    tbl_filled_details 

    Id | Join_Date | UserId | 
    ------------------------ 
    1 | Mar-2014 | 1  | 
    2 | Dec-2014 | 6  | 
    2 | Dec-2014 | 15 | 
    3 | May-2016 | 3  | 

Meine gewünschte Ausgabe ist

Year | Total | Filled | 
----------------------- 
2014 | 15 | 3  | 
2015 | 3  | 0  | 
2016 | 0  | 3  | 
+0

Bitte bearbeiten Sie Ihre Frage, um die relevanten Tabellen DDL + DML für Beispieldaten und noch wichtiger, um die irrelevanten Tags zu entfernen. –

+0

Warum sollte eine Spalte namens Jahr einen Monat drin haben? Und ich verstehe die Rolle der ID-Spalte in der Tabelle fill_details nicht. – Strawberry

+0

(i) Sind die Datumswerte als Strings gespeichert? (ii) Wie leiten Sie die ** Gefüllten ** Werte von der gegebenen Eingabe ab? (Für 2014 scheint es die Zählung zu sein, für 2016 der Verbatim-Wert.) – Abecee

Antwort

0
SELECT 
    (CASE   
     WHEN vac.year not null then to_char(vac.Year,'YYYY')   
     ELSE to_char(det.Year,'YYYY')) as Year, 
     sum(vac.Count) as Total, 
     det.Count as Filled  
    FROM 
     tbl_vacancies_details vac FULL  
    OUTER JOIN (
      SELECT 
       to_char(fil.Join_Date,'YYYY') as Year, 
       count(*) as Count    
      FROM 
       tbl_filled_details as fil    
      GROUP BY 
       to_char(fil.Join_Date,'YYYY')   
     ) det ON det.Year = vac.Year  
    GROUP BY 
     to_char(vac.Year,'YYYY') 

Ich denke, das die Idee der zeigt, wie es zu tun, aber ich bin mir nicht sicher, dass es runnalbe Abfrage. Sie müssen Funktionen finden, um das Datum basierend auf Ihrem Format zu transformieren.

Es voll outter verbindet tbl_vacancies_details für Jahr mit dem inneren select (die die Vorkommen von vac zählt in tbl_filled_details für jedes Jahr) und displayes dann beiden Ergebnisse für jedes Jahr

Edit: Ich asumed dass tbl_filled_details von Fall zu Fall hat Aufzeichnungen von Urlaub und tbl_vacancies_details hat, fasst bereits von Urlaub

1

Diese Ihnen den Einstieg sollten:

SELECT 
    year Year 
    , (SELECT SUM(cnt) FROM tbl_vacancies_details WHERE YEAR(dt) = years.year) Total 
    , (SELECT COUNT(userID) FROM tbl_filled_details WHERE YEAR(join_date) = years.year) Filled 
FROM 
    (SELECT 
    YEAR(dt) year 
    FROM tbl_vacancies_details 
    UNION 
    SELECT 
    YEAR(join_date) 
    FROM tbl_filled_details) years 
; 

sehen sie in Aktion: SQL Fiddle

Bitte kommentieren Sie, wenn und wie dies Anpassung/weitere Details erfordert.

0

würde ich eine union all Abfrage mit Aggregation empfehlen:

select yyyy, 
     sum(total) as total, 
     sum(filled) as filled 
from ((select year(year) as yyyy, count as total, 0 as filled 
     from tbl_vacancies_details 
    ) union all 
     (select year(join_date) as yyyy, 0 as total, 1 as filled 
     from tbl_filled_details 
    ) 
    ) x 
group by yyyy; 

Here eine SQL Fiddle ist.

Hinweis: Ich würde Ihnen raten, Ihre Spalten count und year nicht zu benennen, da diese für andere Zwecke in SQL verwendet werden.

Verwandte Themen