SQL-запрос с проблемой количества соединений с несколькими таблицами и суммы

#sql #multiple-tables

#sql #несколько таблиц

Вопрос:

Есть 2 таблицы. 1 tblBidder и 1 tblItem. Они используют 1 поле, которое устанавливает связь между полями в каждой таблице. Это bidder_number (для tblBidder) и item_bidder_number (для tblItem). Затем у них есть соответствующие поля bidder_sale_id (для tblBidder) и item_sale_id (для tblItem). Это поле предназначено для группы товаров, которые продаются в течение одного сеанса. Таким образом, у вас может быть 20 разных товаров, продаваемых по отдельности, но все они имеют одинаковый идентификатор продажи, потому что они продаются в один и тот же день.

Я пытаюсь получить отчет об общем количестве участников торгов для каждого типа участников торгов, которые были зарегистрированы для участия в аукционе 235, а также выяснить, сколько всего было продано на этом аукционе для этой конкретной группы. Вот что у меня есть для SQL-запроса:

 SELECT     COUNT(dbo.tblBidder.bidder_type) AS TotalRegistrants, SUM(dbo.tblItem.item_premium   dbo.tblItem.item_pr) AS SumTotal, 
                  dbo.tblBidder.bidder_type
FROM         dbo.tblItem INNER JOIN
                  dbo.tblBidder ON dbo.tblItem.item_bidder_number = dbo.tblBidder.bidder_number     AND dbo.tblItem.item_sale_id = dbo.tblBidder.bidder_sale_id
WHERE     (dbo.tblItem.item_sale_id IN (235))
GROUP BY dbo.tblBidder.bidder_type
  

Этот запрос вернул неверное количество зарегистрированных пользователей, но правильную итоговую сумму:

 TotalRegistrants        SumTotal            bidder_type

10          3760.0000       Absentee Bidder
133         173870.6250     Floor Bidder
77          81300.0000      Internet Bidder
29          34862.2500      Mail Bidder
100         242790.2500     Phone Bidder
  

Это просто для получения общего числа владельцев регистрации:

 SELECT     COUNT(bidder_type) AS TotalBidders, bidder_type
FROM         dbo.tblBidder
WHERE     (bidder_sale_id = 235)
GROUP BY bidder_type
  

Который возвращает корректно при:

 TotalBidders    bidder_type

41      Absentee Bidder
79      Floor Bidder
60      Internet Bidder
35      Mail Bidder
82      Phone Bidder
  

Если я попытаюсь присоединить таблицу items к этому последнему запросу, даже если я не выберу никаких новых столбцов, TotalBidders вернет числа в тысячах. Любая помощь была бы высоко оценена.

Ответ №1:

Что, если вы попробуете это?:

 SELECT  COUNT(DISTINCT dbo.tblBidder.bidder_id) AS TotalRegistrants, 
        SUM(dbo.tblItem.item_premium   dbo.tblItem.item_pr) AS SumTotal,
        dbo.tblBidder.bidder_type 
FROM dbo.tblBidder 
LEFT JOIN dbo.tblItem 
ON dbo.tblItem.item_bidder_number = dbo.tblBidder.bidder_number
AND dbo.tblItem.item_sale_id = dbo.tblBidder.bidder_sale_id 
WHERE (dbo.tblBidder.bidder_sale_id  = 235) 
GROUP BY dbo.tblBidder.bidder_type 
  

Комментарии:

1. По-прежнему правильная цена, но неправильное количество и отличается от того, что я уже получаю и каким оно должно быть.

2. @James — Ты можешь попробовать сейчас?. И скажите мне, являются ли результаты подсчета больше или меньше. Спасибо

3. Количество для всех них равно 1.

4. @James — Да, столбец в COUNT(DISTINCT должен был быть ключом таблицы dbo.tblBidder , я изменил сейчас (но я не уверен, правильный ли это столбец, поэтому вам следует изменить его на первичный ключ таблицы участников торгов)