2017-10-20 161 views
0

我正在構建一個帶有LEFT JOIN的Access查詢,其中包括計算JOIN左表中存在的唯一sampleID的數量,並計算總數樣品(蟲子)出現在JOIN的右表中,對於給定的一組樣品(TripID)。下面是SQL代碼相關的塊:僅從左側連接的計數記錄

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 

我有麻煩的是,COUNT(t1.SampleID)不給我我想要的結果。我期望的結果是給定TripID(假設7)中t1中唯一的SampleID的數量。相反,我得到的似乎是在給定的TripID組中包含SampleID的t2中的行數(假設爲77)。如何更改此SQL查詢以獲取所需的數字(7,不是77)?

+0

編輯您的問題,並提供樣本數據和預期結果。 –

回答

0

只取總金額第一的T2,然後用T2加入這樣的:

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

正如其他答覆者正確指出的那樣,這是一個棘手的查詢,並且在其中有一些不必要的子句。我接受了這個答案,因爲我讚賞解決方案的相對簡單和優雅,以及首先在t2上進行彙總的解釋。 – cgjeff

0

這是一個棘手的查詢,因爲您有不同的層次結構。這裏有一個方法:

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

你提供一個DISTINCT與組通過。這是刪除重複兩次,這是不必要的複雜。你可以擺脫DISTINCT。

我會將計數與組中的情況分開。

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