SQL-запрос общего объема продаж в реальном мире

#mysql #sql #join

#mysql #sql #Присоединиться

Вопрос:

Я довольно новичок в SQL, и мне трудно решить проблему.

«Каковы общие продажи по всем продуктам для продавцов, которые продают по крайней мере одну единицу каждого из пяти отдельных продуктов с самыми высокими продажами по единицам? Убедитесь, что запрос возвращает общее количество долларов продаж в порядке убывания. Учитывайте только продажи, которые происходят в течение шести полных месяцев, предшествующих параметру @target_date. ‘

в БД существует 3 таблицы.
Продавец (Salesperson id, SalesYTD)
SalesOrderHeader (SalesOrderID, OrderDate, ShipDate)
SalesOrderDetail (SalesOrderID, SalesOrderDetailID, OrderQty, ProductID, UnitPrice)

Это то, где я нахожусь до сих пор. Мне нужно скомпилировать то, что у меня есть, в один оператор и внести необходимые изменения. Пожалуйста, помогите!

Чтобы получить 5 самых высоких продаж по единицам, должен работать следующий СИНТАКСИС:

 SELECT 
    ProductID, 
    SUM(Orderqty*Unitprice)   
FROM SalesOrderDetail  
GROUP BY ProductID  
WHERE Orderqty >=1 
  AND COUNT(productID) =5  
ORDER BY SUM(Orderqty*Unitprice) DESC  
LIMIT 5; 
 

Я думаю, что для параметра target_date это будет что-то в этом роде?

 SELECT 
    SalespersonID AS ‘Sales Representative’, 
    SalesYTD AS ‘Total Sales’, target_date  
FROM Salesperson  
WHERE target_date BETWEEN01-DEC-13AND01-May-14’;  
 

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

1. Если описания таблиц являются полными, то нет соединения от SalesOrderDetail до SalesPerson .

2. Предположим, что у него есть соединение через FK SalesPersonID . Извините — забыл упомянуть об этом.

3. Я уменьшил таблицы до необходимых полей.

Ответ №1:

Для пяти самых высоких продаж я бы предпочел предложить слегка упрощенный

 select productid, sum(orderqty * unitprice) as sales
from salesorderdetail
group by productid
order by sales desc
limit 5
 

и за шесть месяцев до @target_date чего-то вроде

 where orderdate between date_sub(@target_date, interval 6 months) and @target_date
 

Предполагая FK SalesOrderDetail(SalesPersonID) , затем вы можете объединить таблицы и пять лучших продаж как

 select p.*
from salesperson p
join salesorderheader h on h.salespersionid = p.salespersionid
join salesorderdetail d on d.salesorderid = h.salesorderid
join (select productid, sum(orderqty * unitprice) as sales
      from salesorderdetail
      group by productid
      order by sales desc
      limit 5) t5 on t5.productid = d.productid
where h.orderdate between date_sub(@target_date, interval 6 months) and @target_date
order by p.salesytd desc