Критерии выбора SQL для сгруппированного агрегата - PullRequest
0 голосов
/ 20 января 2009

Я пытаюсь найти простой оператор MySQL для следующих двух проблем:

У меня есть 4 таблицы: Сотрудники, Клиенты, Заказы, Продукты (Каждая запись в Заказах содержит дату, ссылку на один продукт, количество и ссылку на клиента и ссылку на Сотрудника).

Сейчас я пытаюсь привлечь всех покупателей, у которых объем продаж (количество * product.price) в 1996 году больше, чем в 1995 году.

И: я хочу перечислить всех сотрудников, чей объем продаж ниже среднего объема продаж.

Любая помощь будет принята с благодарностью. Мне удалось получить информацию с помощью сценария php, но я думаю, что это можно сделать с помощью некоторых умных операторов SQL.

Кто-нибудь может мне помочь?


Таблица сотрудников: ID # Имя

Таблица продуктов: ID # NAME # PRICE

Таблица заказов: ODERID # CUSTOMERID # ДАТА # СОТРУДНИК # PRODUCTID # КОЛИЧЕСТВО

Ответы [ 3 ]

3 голосов
/ 20 января 2009

Для первой части (если немного рассказать о схеме):

SELECT Customers.ID
FROM Customers 
    LEFT JOIN orders AS o1 ON o1.CustomerID=Customers.ID AND YEAR(o1.DATE) = 1995
    LEFT JOIN products AS p1 ON p1.id = o1.productID
    LEFT JOIN orders AS o2 ON o2.CustomerID=Customers.ID AND YEAR(o2.DATE) = 1996
    LEFT JOIN products AS p2 ON p2.id = o2.productID
HAVING SUM(o1.quantity* p1.price) < SUM(o2.quantity*p2.price)
2 голосов
/ 20 января 2009

Я не знаю тип используемой вами базы данных, поэтому я буду использовать sqlserver. Функция «Год» доступна в большинстве баз данных, поэтому вы сможете переписать запрос для вашей базы данных.

Я думаю, что это запрос, который возвращает все заказные + заказные итоги для клиентов, чей общий объем в 1996 году был выше, чем в 1995 году, но я его не проверял. Решающим является предложение HAVING, где вы можете указать тип предложения WHERE на основе сгруппированного результата.

SELECT  o.CustomerId, SUM(o.Quantity * p.Price) AS Total
FROM    Orders o INNER JOIN Products p
        ON o.ProductId = p.ProductId
WHERE   YEAR(o.Date) == 1996
GROUP BY o.CustomerId
HAVING SUM(o.Quantity * p.Price) > 
(
    SELECT  SUM(o.Quantity * p2.Price) AS Total
    FROM    Orders o2 INNER JOIN Products p2
            ON o2.ProductId = p.ProductId
    WHERE   YEAR(o.Date) == 1995
            AND o2.CustomerId = o.CustomerId
    GROUP BY o.CustomerId
)
0 голосов
/ 20 января 2009

что-то в этом роде:

  1. выберите * из клиентов c где (выберите сумму (o.quantity * p.price) из заказов o, product p, где o.productID = p.productID и o.dateyear = 1996 и o.customerID = c.customerID) <(выберите сумму (o.quantity * p.price) из заказов o, продукт p, где o.productID = p.productID и o.dateyear = 1995 и o.customerID = c.customerID) </p>

  2. выберите * среди сотрудников e где (выберите avg (o.quantity * p.price) из заказов o, product p, где o.productID = p.productID и o.empID = e.EmpID) <(выберите avg (o.quantity * p.price) из заказов o, продукт p, где o.productID = p.productID) </p>

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