2017-10-20 159 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