2016-10-20 4 views
1

Im Wesentlichen versuche ich, alle Mitarbeiter zu erfassen, die innerhalb von 1 Monat, 2 Monaten, 3 Monaten und nach bestimmten Verfallterminen für Sicherheitskurse sind. Alle vier Abfragen ziehen Daten aus demselben Satz von Tabellen.MS Access 13 SQL: Wie kann ich die Ergebnisse von vier Aggregat-Unteranfragen kombinieren?

Bis jetzt habe ich eine Abfrage erstellt, die dies für eine Bedingung tut und für jeden Datumsbereich dupliziert. Der Datensatz zurückgegeben wird, ist ähnlich der folgenden:

 
Company | EX | 
-------------- 
Acme | 27 | 
Bacme | 87 | 
EBDC | 21 | 
... 

Was ich versuche jetzt zu tun ist, sie zu kombinieren, so dass ich eine Abfrage, die eine Daten wie den folgenden Satz zurückgibt.

 
Company | EX | M1 | M2 | M3 | 
----------------------------- 
Acme | 27 | 32 | 76 | 40 | 
Bacme | 87 | 12 | 33 | 76 | 
EBDC | 21 | 44 | 65 | 87 | 

Ich habe versucht, eine Gewerkschaft zu schaffen, sondern das Ergebnis wollte ich nicht bekommen, und ich habe auch eine innere Verknüpfung in einer Sub-Abfrage zu erstellen versucht.

Aber, weiß nicht wirklich was ich mache. Ich wäre dankbar für jede Hilfe bei der Lösung dieses Problems, danke!

Nach dem untenstehenden Rat konnte ich diese Uber Abfrage erstellen! Und es funktioniert gut.

<pre> 
SELECT 
    Q0.CN, 
    Q0.EX, 
    Q1.M1, 
    Q2.M2, 
    Q3.M3 
FROM 
    (((((
    SELECT 
     Companies.[Company Name] AS [CN], 
     Count(Companies.[Company Name]) AS [EX] 
    FROM 
     (SELECT 
     Companies.[Company Name] 
     FROM 
     Courses INNER JOIN 
     ((Companies INNER JOIN 
      Candidates ON 
      Companies.[ID] = Candidates.[Company ID]) INNER JOIN 
      [Individual Candidate Course History] ON 
      Candidates.[ID] = [Individual Candidate Course History].[Candidate ID]) ON 
      Courses.[ID] = [Individual Candidate Course History].[Course ID] 
    WHERE 
     (([Individual Candidate Course History].[Valid Until])<Date()) 
    ORDER BY 
     [Individual Candidate Course History].[Valid Until]) 
    GROUP BY 
     Companies.[Company Name]) AS Q0 LEFT JOIN 
    (SELECT 
     Companies.[Company Name] AS [CN], 
     Count(Companies.[Company Name]) AS M1 
    FROM 
     (SELECT 
      Companies.[Company Name] 
     FROM 
      Courses INNER JOIN 
      ((Companies INNER JOIN 
      Candidates ON 
      Companies.[ID] = Candidates.[Company ID]) INNER JOIN 
      [Individual Candidate Course History] ON 
      Candidates.[ID] = [Individual Candidate Course History].[Candidate ID]) ON 
      Courses.[ID] = [Individual Candidate Course History].[Course ID] 
    WHERE 
     ((([Individual Candidate Course History].[Valid Until]) 
     Between Date() And DateAdd("m",1,Date()))) 
    ORDER BY 
     [Individual Candidate Course History].[Valid Until]) 
    GROUP BY 
     Companies.[Company Name]) AS Q1 ON 
    Q0.CN = Q1.CN) LEFT JOIN 
    (SELECT 
     Companies.[Company Name] AS [CN], 
     Count(Companies.[Company Name]) AS M2 
    FROM 
     (SELECT 
      Companies.[Company Name] 
     FROM 
      Courses INNER JOIN 
      ((Companies INNER JOIN 
      Candidates ON 
      Companies.[ID] = Candidates.[Company ID]) INNER JOIN 
      [Individual Candidate Course History] ON 
      Candidates.[ID] = [Individual Candidate Course History].[Candidate ID]) ON 
      Courses.[ID] = [Individual Candidate Course History].[Course ID] 
     WHERE 
      ((([Individual Candidate Course History].[Valid Until]) 
     Between DateAdd("m",1,Date()) And DateAdd("m",2,Date()))) 
     ORDER BY 
     [Individual Candidate Course History].[Valid Until]) 
GROUP BY 
    Companies.[Company Name] 
ORDER BY 
    Companies.[Company Name]) AS Q2 ON 
Q0.CN = Q2.CN) LEFT JOIN 
(SELECT 
    Companies.[Company Name] AS [CN], 
    Count(Companies.[Company Name]) AS M3 
    FROM 
    (SELECT 
     Companies.[Company Name] 
    FROM 
     Courses INNER JOIN 
     ((Companies INNER JOIN 
     Candidates ON 
     Companies.[ID] = Candidates.[Company ID]) 
     INNER JOIN [Individual Candidate Course History] ON 
     Candidates.[ID] = [Individual Candidate Course History].[Candidate ID]) ON 
     Courses.[ID] = [Individual Candidate Course History].[Course ID] 
    WHERE 
    ((([Individual Candidate Course History].[Valid Until]) 
    Between DateAdd("m",2,Date()) And DateAdd("m",3,Date()))) 
    ORDER BY 
     [Individual Candidate Course History].[Valid Until]) 
    GROUP BY 
     Companies.[Company Name] 
ORDER BY 
    Companies.[Company Name]) AS Q3 ON 
Q0.CN = Q3.CN)) 
     </pre> 
+0

Bitte bearbeiten Sie die Frage und zeigen die Abfrage, die Sie aufgebaut haben. –

Antwort

0

Sie wollen Left join

select Qry1.Company, Qry1.Ex, Qry2.Ex as M1, Qry3.Ex as M2, Qry4.Ex as M3 
from ((Qry1 
left join Qry2 
    on Qry1.Company = Qry2.Company) 
left join Qry3 
    on Qry1.Company = Qry3.Company) 
left join Qry4 
    on Qry1.Company = Qry4.Company 
+1

Beachten Sie, dass in MS Access SQL-Join-Paarungen Klammern erforderlich sind, andernfalls wird OP einen Fehler melden. – Parfait

+0

Ich verstehe immer noch nicht, warum Access nicht mit SQL Server-Syntax funktioniert ... Stupid MS. – JohnHC

+0

Klammern sind nicht erforderlich um 'ON'-Klauseln, sondern 'JOIN'-Anweisungen. Siehe meine Bearbeitung. – Parfait

1

Betrachten sie nur eine Abfrage mit bedingten Aggregaten für Monat Spalte verwenden. Während ich Ihren Datumsausdruck nicht kenne, verschiebe die WHERE-Klausel jeder Abfrage in eine logische IIF()-Anweisung, die in SUM() der Berechnung von 1 und 0 eingepackt ist. Passen Sie auch die FROM Klausel mit allen erforderlichen JOIN Anweisungen an.

SELECT t.Company, Count(t.*) AS [EX], 
     SUM(IIF(DATEDIFF('m', Date(), t.ExpiryDate) = 1, 1, 0) AS [M1], 
     SUM(IIF(DATEDIFF('m', Date(), t.ExpiryDate) = 2, 1, 0) AS [M2], 
     SUM(IIF(DATEDIFF('m', Date(), t.ExpiryDate) = 3, 1, 0) AS [M3] 
FROM TableName t 
GROUP BY t.Company 

Per OPs Aktualisierung der tatsächlichen Arbeits Abfrage, sollten Sie die folgende Abfrage keine Unterabfragen verwenden:

SELECT 
    Companies.[Company Name] AS [CN], 
    SUM(IIF([Individual Candidate Course History].[Valid Until] <= Date(), 1, 0)) AS [EX], 
    SUM(IIF([Individual Candidate Course History].[Valid Until] 
      BETWEEN Date() AND DateAdd("m",1,Date()), 1, 0)) AS [M1], 
    SUM(IIF([Individual Candidate Course History].[Valid Until] 
      BETWEEN DateAdd("m",1,Date()) AND DateAdd("m",2,Date()), 1, 0)) AS [M2], 
    SUM(IIF([Individual Candidate Course History].[Valid Until] 
      BETWEEN DateAdd("m",2,Date()) AND DateAdd("m",3,Date()), 1, 0)) AS [M3] 

FROM  
    Courses INNER JOIN 
    ((Companies INNER JOIN 
    Candidates ON Companies.[ID] = Candidates.[Company ID]) 
    INNER JOIN [Individual Candidate Course History] 
     ON Candidates.[ID] = [Individual Candidate Course History].[Candidate ID]) 
    ON Courses.[ID] = [Individual Candidate Course History].[Course ID] 
GROUP BY 
    Companies.[Company Name] 
+0

Nur die oben genannten funktioniert gut, danke Parfait! Und jetzt habe ich es in eine SELECT ... INTO-Anweisung verwandelt !!! – user7043547

+0

Fantastisch! Bitte akzeptieren Sie die hilfreichste Antwort, um die Auflösung zu bestätigen. – Parfait