2017-10-20 2 views
0

Ich baue eine Access-Abfrage mit einem LINKEN JOIN, die unter anderem zählt die Anzahl der eindeutigen sampleIDs in der linken Tabelle des JOIN, und zählt die Aggregatnummer der Proben (Käfer) in der rechten Tabelle des JOIN, beide für eine bestimmte Gruppe von Proben (TripID). Hier ist das betreffende Stück SQL-Code:Zählen Datensätze nur von der linken Seite eines LINKEN JOIN

SELECT DISTINCT t1.TripID, COUNT(t1.SampleID) AS Samples, SUM(t2.C1 + t2.C2) 
AS Bugs FROM tbl_Sample AS t1 
LEFT JOIN tbl_Bugs AS t2 ON t1.SampleID = t2.SampleID 
GROUP BY t1.TripID 

Das Problem das ich habe ist, dass COUNT (t1.SampleID) nicht ich mein gewünschtes Ergebnis. Mein gewünschtes Ergebnis ist die Anzahl der eindeutigen SampleIDs, die in t1 für eine gegebene TripID vorhanden sind (sagen wir 7). Stattdessen scheint die Anzahl der Zeilen in t2 zu sein, für die die SampleID in der angegebenen TripID-Gruppe enthalten ist (sagen wir 77). Wie kann ich diese SQL-Abfrage ändern, um die gewünschte Nummer (7, nicht 77) zu erhalten?

+0

Bearbeiten Sie Ihre Frage und liefern Sie Beispieldaten und gewünschte Ergebnisse. –

Antwort

0

nehmen nur die Gesamtsumme zuerst auf t2, dann kommen Sie mit t2 wie folgt aus:

SELECT t1.TripID, COUNT(t1.SampleID) AS Samples, SUM(t3.Bugs) as Bugs 
FROM tbl_Sample AS t1 
LEFT Join (
    SELECT t2.SampleID, SUM(t2.C1 + t2.C2) as Bugs 
    FROM tbl_Bugs as t2 
    GROUP BY SampleID) AS t3 ON t1.SampleID = t3.SampleID 
GROUP BY t1.TripID 
+0

Wie andere Beantworter richtig angemerkt haben, war dies eine knifflige Abfrage und enthielt auch einige unnötige Klauseln. Ich akzeptierte diese Antwort, weil ich die relative Einfachheit und Eleganz der Lösung sowie die Erklärung der Aggregation zuerst auf t2 schätzte. – cgjeff

0

Dies ist eine schwierige Abfrage, weil Sie unterschiedliche Hierarchien haben. Hier ist eine Methode:

select s.tripid, count(*) as numsamples, 
     (select sum(b2.c1 + b2.c2) 
     from bugs b join 
      tbl_sample s2 
      on s2.sampleid = b.sampleid 
     where s2.tripid = s.tripid 
     ) as numbugs 
from tbl_sample s 
group by s.tripid 
0

Sie enthalten eine DISTINCT mit einer Gruppierung. Dadurch werden doppelte Einträge doppelt entfernt, was unnötig komplex ist. Sie können die DISTINCT loswerden.

Ich hätte die Zählung getrennt von dem, was in der Gruppe vorgeht.

SELECT dT.TripID 
     ,(SELECT COUNT(DISTINCT(SampleID)) 
      FROM Bugs B 
     WHERE B.TripID = dT.TripID 
     ) AS [Samples] 
     ,dT.Bugs 
    FROM (
     SELECT t1.TripID 
       ,SUM(t2.C1 + t2.C2) AS Bugs 
      FROM tbl_Sample AS t1 
       LEFT JOIN tbl_Bugs AS t2 ON t1.SampleID = t2.SampleID 
     GROUP BY t1.TripID 
     ) AS dT 
Verwandte Themen