2016-11-29 4 views
0

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

Так что, если я не использую COUNT (например), он выводит 1000 строк, и если я использую COUNT, он выводит 1000 строк и не дает мне правильное время продажи. Все они перечислены как «1» и не группируются и подсчитываются. Я предполагаю, что это имеет какое-то отношение к моим объединениям, но я не могу понять это.

Ниже приведен пример того, что я вижу после использования COUNT (я удалил бренд и date_added, чтобы упростить чтение). ProductID показываются не один раз, хотя они должны быть сгруппированы и подсчитаны.

times_sold | ProductID | title  
---------- | --------- | --------- 
1   | 17998  | title 2 
1   | 13670  | title 3 
1   | 17956  | title 4 
1   | 4569  | title 5 
1   | 12598  | title 1 
1   | 12598  | title 1 
1   | 17998  | title 2 

А вот запрос я бегу:

SELECT TOP (100) PERCENT 
    COUNT(s.ProductID) AS times_sold, 
    s.ProductID, p.title, p.brandname, p.date_added 
FROM 
    dbo.TBL_OrderSummary AS s 
INNER JOIN 
    dbo.jewelry AS p ON s.ProductID = p.ProductID 
INNER JOIN 
    dbo.sent_items AS i ON s.InvoiceID = i.ID 
GROUP BY 
    s.ProductID, p.title, p.brandname, p.flare_type, p.date_added, 
    i.date_order_placed, i.ship_code, p.jewelry 
HAVING 
    (p.title LIKE '%stone%') 
    AND (i.date_order_placed > CONVERT(DATETIME, '2016-01-01 00:00:00', 102)) 
    AND (i.ship_code = N'paid') 
    AND (p.flare_type = 'Single flare') 
    AND (p.jewelry LIKE '%plugs%') 

Спасибо за любую помощь!

+0

Это не совсем понятно, что вы ожидаете для вывода здесь, но ваша группа по внешности довольно подозрительно ко мне. Я не думаю, что вы хотите группировать любые значения в send_items. Вы хотите группировать только столбцы, которые составляют группу, которую вы хотите подсчитать. –

ответ

2

Причина, по которой они не выглядят правильно, состоит в том, что записи не совпадают друг с другом в строке. Если у вас есть имя продукта Widget 2, а год составляет 2015 год, и у вас есть еще один виджет имени продукта, а год, составленный в 2016 году, он будет собирать только 1 рядом с каждым продуктом, потому что вся строка появляется только один раз. Вам нужно будет ограничить свою группу, чтобы получить точный счет.

GROUP BY s.productID, p.title, COUNT(s.productID) 

Это должно дать вам точный счет. Вы просто ограничиваете свою группу слишком большим образцом, чтобы получить уникальные записи. Вам придется сократить то, что находится в вашем выборе для этого, чтобы работать, вам нужно иметь s.Product и p.title в вашем выборе, чтобы соответствовать группе. Надеюсь это поможет.

+0

Спасибо! Объяснение того, как записи должны соответствовать всем, помогло мне переместить вещи и получить нужные мне данные. Еще раз спасибо за ваш ответ :) –

+0

Добро пожаловать! Рад узнать, что я смог помочь. –

0

Если вы не фильтруете свою агрегатную функцию (то есть HAVING COUNT(s.ProductID) > 2), тогда вы можете перенести все ваши критерии выбора на линию WHERE.

Таким образом, вы можете попробовать:

select count(s.ProductID) times_sold, s.ProductID, p.title 
from dbo.TBL_OrderSummary s inner join dbo.jewelry p on s.ProductID = p.ProductID 
    inner join dbo.sent_items i on s.InvoiceID = i.ID 
where p.title like '%stone%' 
    and i.date_order_placed > CONVERT(DATETIME, '2016-01-01 00:00:00', 102) 
    and i.ship_code = N'paid' 
    and p.flare_type = 'Single flare' 
    and p.jewelry like '%plugs%' 
group by s.ProductID, p.title 
Смежные вопросы