2014-11-14 2 views
-1

Этот SQL возвращает количество записей в таблице Dims вместо того, чтобы возвращать количество записей таблицы BIDdetails. Как я могу исправить?SQL, возвращающий счет из неправильной таблицы

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") 
+0

Поскольку, по-видимому, 'Dims' имеет несколько строк для каждой строки в' BIDetails', хотя вы не указали достаточно подробностей для нас, чтобы быть уверенными. Вам нужно предварительно агрегировать в подзапросе, если это так. Замечание: конкатенация - отличный способ внедрить SQL-инъекцию, вы должны использовать параметризованные запросы. –

ответ

1

выражение:

count(BIDdetails.Origin) 

просто подсчитывает число ненулевых значений BIDdetails.Origin в каждой группе. Поскольку вы фактически группируете по полю, это будет количество строк в каждой группе.

Вы можете получить то, что хотите в большинстве баз данных, используя 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; 

И затем суммируют результаты либо в приложении или путем присоединения этого запроса обратно в исходный.

EDIT:

Это ваш исходный запрос:

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 относится к тому, что уникальный идентификатор для того, что вы хотите, чтобы сосчитать.

+0

Привет, Гордон, спасибо за ваш быстрый ответ. Не могли бы вы дать мне полное заявление, включая ** LEFT JOIN? **, поскольку выше это не работает для меня. –

Смежные вопросы