SQL从错误的表返回计数

时间:2014-11-14 21:57:40

标签: sql access-vba ms-access-2010 left-join

此SQL返回表Dims的记录计数,而不是返回表BIDdetails的记录计数。我该如何解决?

BIDReportSearch.CommandText = ("SELECT BIDdetails.Origin, BIDdetails.Destination,
Round(Sum(Dims.ChargeableWeight)) as CWeight, count(BIDdetails.Origin) as NoOfShpt
FROM BIDdetails LEFT JOIN DIMS ON BidDetails.BID=Dims.BID
where BIDdetails.OrgCountry<>'AE' and BIDdetails.DestCountry='AE' and
BIDdetails.ClosingDate>=#" & dtpBIDfrom.Value & "# and BIDdetails.ClosingDate<=#" &
dtpBIDto.Value & "# GROUP BY BIDdetails.Origin, BIDdetails.Destination
ORDER BY Round(Sum(Dims.ChargeableWeight)) DESC")

1 个答案:

答案 0 :(得分:1)

表达式:

count(BIDdetails.Origin)

只计算每个组中BIDdetails.Origin的非NULL值的数量。因为您实际上是按字段分组,所以这将是每个组中的行数。

通过在唯一标识符上使用count(distinct),您可以在大多数数据库中获得所需内容。唉,MS Access不支持count(distinct),因此在Access中编写这样的查询要困难得多。您可以通过以下方式获取count字段:

SELECT BIDdetails.Origin, BIDdetails.Destination, count(*) as NoOfShpt
FROM BIDdetails 
where BIDdetails.OrgCountry <> 'AE' and BIDdetails.DestCountry='AE' and
      BIDdetails.ClosingDate>=#" & dtpBIDfrom.Value & "# and BIDdetails.ClosingDate<=#" & dtpBIDto.Value & "#
GROUP BY BIDdetails.Origin, BIDdetails.Destination;

然后将结果合并到您的应用程序中,或者将此查询重新加入原始查询中。

编辑:

这是您的原始查询:

SELECT d.Origin, d.Destination,
       Round(Sum(Dims.ChargeableWeight)) as CWeight, count(d.Origin) as NoOfShpt
FROM BIDdetails as d LEFT JOIN
     DIMS
     ON BidDetails.BID=Dims.BID
where d.OrgCountry <> 'AE' and d.DestCountry='AE' and
      d.ClosingDate> = #" & d.Value & "# and d.ClosingDate<=#" & dtpBIDto.Value & "#
GROUP BY d.Origin, d.Destination
ORDER BY Round(Sum(Dims.ChargeableWeight)) DESC

还有另一种方法,首先按细节聚合,然后再聚合。在这种情况下,我认为这更容易:

SELECT Origin, Destination, SUM(CWeight) as CWeight, COUNT(*) as NumShip
FROM (SELECT d.id, d.Origin, d.Destination,
             Round(Sum(Dims.ChargeableWeight)) as CWeight, count(d.Origin) as NoOfShpt
      FROM BIDdetails as d LEFT JOIN
           DIMS
           ON BidDetails.BID = Dims.BID
      where d.OrgCountry <> 'AE' and d.DestCountry='AE' and
            d.ClosingDate> = #" & d.Value & "# and d.ClosingDate<=#" & dtpBIDto.Value & "#
      GROUP BY d.id, d.Origin, d.Destination
     ) as d
GROUP BY Origin, Destination
ORDER BY Round(Sum(CWeight)) DESC;

d.id指的是您想要计算的唯一ID。