Получить агрегированные средние значения, соединяющие вторую таблицу, и отобразить их рядом с каждым значением в первой таблице - PullRequest
4 голосов
/ 28 февраля 2020

У меня есть две таблицы, которые вы также можете найти в SQL скрипке :

CREATE TABLE Sales (
    Product_ID VARCHAR(255),
    Category_ID VARCHAR(255),
    Sales_Value VARCHAR(255),
    Sales_Quantity VARCHAR(255)
);
INSERT INTO Sales
(Product_ID, Category_ID, Sales_Value, Sales_Quantity)
VALUES 
("P001", "C001", "500", "200"),
("P002", "C001", "600", "100"),
("P003", "C002", "300", "250"),
("P004", "C002", "900", "400"),
("P005", "C002", "800", "600"),
("P006", "C003", "200", "150"),
("P007", "C003", "700", "550");


CREATE TABLE Categories (
    Category_ID VARCHAR(255),
    Category_Name VARCHAR(255)
);
INSERT INTO Categories
(Category_ID, Category_Name)
VALUES 
("C001", "Fashion"),
("C002", "Sport"),
("C003", "Shoes");

Первая таблица содержит Sales для каждой товар.
Вторая таблица содержит Categories.


Теперь я хочу отобразить все продукты и average_sales_price_per_category рядом с каждым продуктом.
Результат должен выглядеть следующим образом:

Product_ID      Category      average_sales_price_per_category
P001             Fashion               3.66
P002             Fashion               3.66
P003             Sport                 1.60
P004             Sport                 1.60
P005             Sport                 1.60
P006             Shoes                 1.28
P007             Shoes                 1.28

Я пытался go с решением от этот вопрос , но я думаю, что предложение OVER не доступно в моем MySQL версия:

SELECT 
s.Product_ID, 
c.Category_Name,
((SUM(s.Sales_Value * s.Sales_Quantity) over (partition BY c.Category_ID) /
SUM(s.Sales_Value) over (partition BY c.Category_ID)) as average_sales_price
FROM Sales s
JOIN Categories c ON c.Category_ID = s.Category_ID;

Ошибка:

проверьте руководство, соответствующее вашей MySQL версии сервера, на предмет правильного синтаксиса для использования почти (раздел BY c .Category_ID) / SUM (s.Sales_Value) over (partition BY c .Cate 'в строке 4

Какие еще SQL я могу использовать для получения ожидаемого результата?

Ответы [ 3 ]

1 голос
/ 28 февраля 2020

Вы должны использовать AVG() здесь в качестве аналитической функции c:

SELECT 
    s.Product_ID,
    c.Category_Name,
    AVG(s.Sales_Value * s.Sales_Quantity) OVER (PARTITION BY c.Category_ID) AS average_sales_price
FROM Sales s
INNER JOIN Categories c
    ON c.Category_ID = s.Category_ID;

Точная ошибка, которую вы получаете, исходит от использования SUM() в знаменателе в качестве агрегатной функции, без используя GROUP BY. Другая проблема с тем, что вы пытались сделать, заключается в том, что общая сумма может быть равна нулю, что приведет к ошибке в вашем запросе. Вместо того, чтобы пытаться исправить ваш текущий подход, вы должны использовать AVG.

Демо

0 голосов
/ 28 февраля 2020

Для более старой версии вы можете использовать коррелированный подзапрос:

SELECT s.Product_ID, c.Category_Name,
       (SELECT SUM(SS.Sales_Value) / SUM(SS.Sales_Quantity)
        FROM Sales SS 
        WHERE SS.Category_ID = S.Category_ID
       ) AS average_sales_price
FROM Sales s JOIN 
     Categories c 
     ON c.Category_ID = s.Category_ID;

Здесь SQL Fiddle .

0 голосов
/ 28 февраля 2020

Вы можете получить ожидаемый результат, используя подзапрос:

SELECT 
  s.Product_ID,
  ca.Category_Name,
  ROUND(average_sales_price, 2) as average_sales_price
FROM Sales s
JOIN (
  SELECT 
    c.Category_ID,
    c.Category_Name,
    AVG(s.Sales_Value / s.Sales_Quantity) as average_sales_price
  FROM Sales s
  JOIN Categories c ON c.Category_ID = s.Category_ID
  GROUP BY s.Category_ID 
) ca
ON ca.Category_ID = s.Category_ID

Производная таблица ca является обогащенной Category таблицей со средней ценой продажи для каждой категории, поэтому вы можете присоединиться к этой производной таблице вместо оригинала Category.

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