2016-09-23 2 views
3

У меня есть следующие схемы баз данных (повторно изображение), Database SchemaВремя резюме из базы данных нескольких сущностей

И я пытаюсь написать запрос, который будет возвращать результатам что-то вроде этого ... (Заголовки столбцов) : Product_Group - Product_Name - Week1 - Week2 - Week3 - Week4 - QTY_Order

Week1 все продажи определенного продукта между текущей даты и предыдущие 7 дней. Week2 все продажи определенного продукта 2 недели назад (таким образом между CurrentDate -7days И CurrentDate -14 дней)
Week3 все продажи определенного продукта от 3 недель назад ... и т.д.;
QTY_Order должен быть в среднем при определенных продажах продуктов Week1, Week2, Week3 & Week4.

Следующий SQL будет производить: Product_Group - Product_Name - Week1 - QTY_Order (но неверно количество_порядка).

SELECT Product.ProductGroupId, Product.Name, SUM(SaleLine.Quantity) AS Week1, SUM(SaleLine.Quantity) AS OrderQty 
FROM Sale 
JOIN SaleLine ON Sale.ID = SaleLine.SaleId 
JOIN Product ON SaleLine.ProductId = Product.Id 
WHERE Sale.SaleDateTime > (CURDATE() - INTERVAL 7 DAY) 
GROUP BY Product.ProductGroupId, Product.Name; 

Я также попытался следующий SQL, чтобы получить: - PRODUCT_NAME доступно Week1 - Week2 - QTY_Order (опять же, qty_order неверна), но week2 возвращает все нуль-ые годы.

SELECT Product.ProductGroupId, Product.Name, SUM(SaleLine.Quantity) AS Week1, (SELECT SUM(SaleLine.Quantity) 
    FROM SaleLine 
    JOIN Sale ON SaleLine.SaleID = Sale.ID 
    JOIN Product on SaleLine.ProductId = Product.Id 
    WHERE Sale.SaleDateTime BETWEEN (CURDATE() - INTERVAL 14 DAY) AND (CURDATE() - INTERVAL 7 DAY)) AS Week2, SUM(SaleLine.Quantity) AS QTY_TO_ORDER 
FROM Sale 
JOIN SaleLine ON Sale.ID = SaleLine.SaleId 
JOIN Product ON SaleLine.ProductId = Product.Id 
WHERE Sale.SaleDateTime > (CURDATE() - INTERVAL 7 DAY) 
GROUP BY Product.ProductGroupId, Product.Name; 

Может ли кто-нибудь указать, где Im пойдет не так с Week2 (что его возвращающий Null).
Может ли кто-нибудь подумать о более легком/чистом способе кодирования этого?
Может ли кто-нибудь указать некоторые указатели для расчета QTY_Order?

Заранее спасибо за любую помощь люди могли обеспечить :-)

** Edit - Добавлен запрос (таблица клиента не входит в комплект):
Создание таблицы отчетности (существуют также различные триггеры, выступающие в качестве ограничений, не включенные)

CREATE TABLE ProductGroup( Id int PRIMARY KEY AUTO_INCREMENT, Name varchar(50) NOT NULL );

CREATE TABLE Product( Id int PRIMARY KEY AUTO_INCREMENT, ProductGroupId int, Name varchar(100) NOT NULL, Price decimal(8,2), QuantityOnHand int NOT NULL, QuantitySold int NOT NULL, QuantityToOrder int NOT NULL, QuantityRequested int NOT NULL, CONSTRAINT FK_Product_ProductGroup FOREIGN KEY (ProductGroupId) REFERENCES ProductGroup(Id) );

CREATE TABLE Sale( Id int PRIMARY KEY AUTO_INCREMENT, CustomerId int, SaleDateTime datetime NOT NULL, CONSTRAINT Sale_Customer FOREIGN KEY (CustomerId) REFERENCES Customer(Id) );

CREATE TABLE SaleLine( Id int PRIMARY KEY AUTO_INCREMENT, ProductId int NOT NULL, SaleId int NOT NULL, Quantity int NOT NULL, CONSTRAINT FK_SaleLine_Product FOREIGN KEY (ProductId) REFERENCES Product(Id), CONSTRAINT FK_SaleLine_Sale FOREIGN KEY (SaleId) REFERENCES Sale(Id) );

+0

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

+0

Это называется сводной таблицей. Обратите внимание, например, на [сводная таблица MySQL] (http://stackoverflow.com/questions/7674786/mysql-pivot-table). Вам придется заменить 'count' на' sum'. Для вашего количества заказа вам понадобится 'max (SaleLine.Quantity) AS OrderQty', потому что вам нужно только один раз. – Solarflare

ответ

1

Вы ищете пять обобщенные вашу информации: Week1, Week2, Week3, Week4 и QTY_Order. Это создает сложный запрос GROUP BY.

Лучше всего подойти к подобным вещам шаг за шагом. Первые два шага должны состоять в том, чтобы писать отдельные запросы, которые генерируют правильные запросы Week1 и QTY_Order. Это поможет вам правильно понять вашу бизнес-логику. Хотите подсчитать заказы? Вы хотите суммировать проданные единицы? Вы хотите суммировать валовой доход?

(я предпочел бы не пытаться писать такие запросы для вас, это ваши данные, а не моя.)

После того, как у вас есть такие вещи правильно, вы можете сделать что-то вроде этого псевдокода, чтобы получить ваш еженедельно резюме.

SELECT group, name, 
     SUM(CASE WHEN saledate < CURDATE() - INTERVAL 0 DAY 
        AND saledate >= CURDATE() - INTERVAL 7 DAY THEN Quantity 
        ELSE 0 END) Week1, 
     SUM(CASE WHEN saledate < CURDATE() - INTERVAL 7 DAY 
        AND saledate >= CURDATE() - INTERVAL 14 DAY THEN Quantity 
        ELSE 0 END) Week2, 
     SUM(CASE WHEN saledate < CURDATE() - INTERVAL 14 DAY 
        AND saledate >= CURDATE() - INTERVAL 21 DAY THEN Quantity 
        ELSE 0 END) Week3 
    FROM (some subquery) 
    GROUP BY group,name 

Этот трюк использует операторы case внутри вашей суммы для выбора транзакций на соответствующую неделю.

Это волокита запроса. Но это сработает.

0

Так что я получил этот код работать: ...

SELECT Product.ProductGroupId, Product.Name, SUM(CASE WHEN Sale.SaleDateTime BETWEEN CURDATE() AND Sale.SaleDateTime <= (CURDATE() - INTERVAL 7 DAY) THEN SaleLine.Quantity ELSE 0 END) AS Week1, SUM(CASE WHEN Sale.SaleDateTime < (CURDATE() - INTERVAL 7 DAY) AND Sale.SaleDateTime >= (CURDATE() - INTERVAL 14 DAY) THEN SaleLine.Quantity ELSE 0 END) AS Week2, SUM(CASE WHEN Sale.SaleDateTime < (CURDATE() - INTERVAL 14 DAY) AND Sale.SaleDateTime >= (CURDATE() - INTERVAL 21 DAY) THEN SaleLine.Quantity ELSE 0 END) AS Week3, SUM(CASE WHEN Sale.SaleDateTime < (CURDATE() - INTERVAL 21 DAY) AND Sale.SaleDateTime >= (CURDATE() - INTERVAL 28 DAY) THEN SaleLine.Quantity ELSE 0 END) AS Week4
FROM Sale JOIN SaleLine ON Sale.ID = SaleLine.SaleId JOIN Product ON SaleLine.ProductId = Product.Id GROUP BY Product.ProductGroupId, Product.Name;

Но я просто не уверен, как это сделать еще одно заявление Case, чтобы получить среднее между Week1, Week2, Week3 , Неделя4

Любые предложения?