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

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

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


CREATE TABLE Products (
    Product_ID VARCHAR(255),
    Product_Name VARCHAR(255),
    Category_ID VARCHAR(255)
);
INSERT INTO Products
(Product_ID, Product_Name, Category_ID)
VALUES 
("P001", "Shirt", "C001"),
("P002", "Dress", "C001"),
("P003", "Hoodie", "C002"),
("P004", "Ball", "C002"),
("P005", "Ski", "C002"),
("P006", "Boot", "C003"),
("P007", "Flip-Flop", "C003");


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 для каждой товар.
Вторая таблица содержит подробную информацию о каждом product.
Третья таблица содержит 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 с решением из этот вопрос , но я получаю Error:

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 Products p ON p.Product_ID = s.Product_ID
JOIN Categories c ON c.Category_ID = p.Category_ID;

Ошибка

Unknown column 'SS.Category_ID' in 'where clause'

Что мне нужно изменить в моем коде, чтобы получить ожидаемый результат?

Ответы [ 3 ]

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

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

Если вы используете MySQL 8.0, вы можете объединить функции агрегации и окна следующим образом:

SELECT 
    p.Product_ID, 
    c.Category_Name,
    SUM(SUM(s.Sales_Value)) OVER(PARTITION BY c.Category_ID)
        / SUM(SUM(s.Sales_Quantity)) OVER(PARTITION BY c.Category_ID)
       AS average_sales_price
FROM Sales s 
JOIN Products p ON p.Product_ID = s.Product_ID
JOIN Categories c ON c.Category_ID = p.Category_ID
GROUP BY p.Product_ID, c.Category_ID, c.Category_Name

Демонстрация на DB Fiddle :

| Product_ID | Category_Name | average_sales_price |
| ---------- | ------------- | ------------------- |
| P001       | Fashion       | 3.6666666666666665  |
| P002       | Fashion       | 3.6666666666666665  |
| P003       | Sport         | 1.6                 |
| P004       | Sport         | 1.6                 |
| P005       | Sport         | 1.6                 |
| P006       | Shoes         | 1.2857142857142858  |
| P007       | Shoes         | 1.2857142857142858  |
0 голосов
/ 28 февраля 2020

Во-первых, у вас нет столбца Category_Id в таблице Sales.

Замените ваши JOIN предложения на LEFT JOIN s против вероятности несоответствующих случаев, и добавьте GROUP BY c.Category_Name, c.Category_ID в конце:

SELECT c.Category_Name,c.Category_ID,
       SUM(S.Sales_Value) / SUM(S.Sales_Quantity) AS average_sales_price       
  FROM Sales s 
  LEFT JOIN Products p ON p.Product_ID = s.Product_ID
  LEFT JOIN Categories c ON c.Category_ID = p.Category_ID
 GROUP BY c.Category_Name, c.Category_ID;

, где коррелированный подзапрос не требуется .

Демо

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

Ваша таблица не видна во внутреннем подзапросе, чтобы избежать условия where во внутреннем подзапросе, вы можете использовать объединение в сгруппированном агрегированном подзапросе

SELECT
s.Product_ID,
Price_Category.average_sales_price_per_category
FROM Sales s
JOIN Products p ON p.Product_ID = s.Product_ID
JOIN
  (SELECT 
  c.Category_ID,
  c.Category_Name,
  SUM(s.Sales_Value) / SUM(s.Sales_Quantity) AS average_sales_price_per_category
  FROM Sales s 
  JOIN Products p ON p.Product_ID = s.Product_ID
  JOIN Categories c ON c.Category_ID = p.Category_ID
  GROUP BY 1) Price_Category ON Price_Category.Category_ID = p.Category_ID;

SQL Fiddle

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