2016-09-10 2 views
1

У меня есть этот 4 таблицы:SQL запросов с группой По утверждению

Менеджеры, Продажи, SaleDetails, продукты:

  • Менеджеры: ID, имя
  • Sales: ID, ManagerID , SaleNO, SaleDate
  • ПродажаДетали: ID, ПродажаID, ProductID, Количество
  • Продукты: ID, имя, Цена

Я хочу retrive для каждого менеджера: SaleDate и уникальный продукт рассчитывать;

Моего выберите выглядит следующим образом:

;WITH cte 
AS 
(
    SELECT sd.SaleID, sd.ProductID FROM dbo.Products p 
     INNER JOIN dbo.SalesDetails sd ON sd.ProductID = p.ID 
    GROUP BY sd.SaleID, sd.ProductID 
) 
SELECT 
    c.Name AS ManagerName 
    ,s.SaleDate 
    ,COUNT(ct.ProductID) AS ProductCount 
FROM cte ct 
    INNER JOIN dbo.Sales s ON ct.SaleID = s.ID 
    INNER JOIN dbo.Managers c ON c.ID = s.ConsultantID 
GROUP BY s.SaleDate, c.Name 

Является ли это оптимальный? Можете ли вы помочь моему, чтобы заменить его более оптимальным запрос

  • Менеджеров: [ID = 1, Name = John;]
  • продаж: [ID = 1, ManagerID = 1, SaleNO = 0015, SaleDate: 2016 -09-08], [ID = 2, ManagerID = 1, SaleNO = 0016, SaleDate: 2016-09-09]
  • ПродажаДетали: [ID = 1, SaleID = 1, ProductID = 1, Quantity = 2], [ID = 2, SaleID = 1, ProductID = 1, Quantity = 4], [ID = 3, SaleID = 1, ProductID = 2, Quantity = 3], [ID = 4, SaleID = 2, ProductID = 1, количество = 3]
  • Продукт: [ID = 1, имя = Sony], [ID = 2, имя = Samsung]

Запрос должен возвращать результаты:

  • ManagerName = Джон, SaleDate = 2016-09-08, ProductCount = 2
  • ManagerName = Джон, SaleDate = 2016-09-09, ProductCount = 1
+0

Работает ли ваш запрос, и вы просите альтернативу? Если вы правильно настроили индексы, эти объединения могут работать довольно эффективно. –

+0

yes Я хочу написать альтернативный запрос. этот запрос работает – www1986

+0

@ www1986 Можете ли вы отправить данные и ожидаемый результат? –

ответ

2
SELECT c.Name AS ManagerName 
     ,s.SaleDate 
     ,COUNT(p.ProductID) 
FROM dbo.Products p 
INNER JOIN dbo.SalesDetails sd ON sd.ProductID = p.ID 
INNER JOIN dbo.Sales s ON sd.SaleID = s.ID 
INNER JOIN dbo.Managers c ON c.ID = s.ConsultantID 
GROUP BY s.SaleDate, c.Name,sd.ProductID 
+0

, но это не будет получать уникальный товарный счет – www1986

+0

@ www1986 Обновлен мой ответ, проверьте его сейчас и сообщите мне, если у вас возникнут проблемы. –

1

правильный ответ (как я прочитал этот вопрос) является:

SELECT c.Name AS ManagerName, s.SaleDate, COUNT(DISTINCT sd.ProductId) 
FROM dbo.SalesDetails sd 
    dbo.Sales s 
    ON sd.SaleID = s.ID INNER JOIN 
    dbo.Managers c 
    ON c.ID = s.ConsultantID 
GROUP BY s.SaleDate, c.Name; 

Примечание:

  • Products стола не нужно, потому что SalesDetails таблица содержит информацию о продукте.
  • Идентификатор продукта не указан в GROUP BY.
  • Правильная функция агрегации - COUNT(DISTINCT).
+0

да, вы правы, но если хотите фильтровать с ценой продукта? например, где p.price> 500 – www1986

+0

@ www1986. , , Это не вопрос, который вы задали. В этом случае вам понадобится таблица продуктов, если информация не указана в 'salesdetails'. –

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