#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 BETWEEN ‘01-DEC-13’ AND ’01-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