Извините за предыдущий ответ. Я хотел бы представить более развёрнутый ответ, как некоторые просили в комментариях. К сожалению, структура вашей базы данных не соответствует требованиям поставленной задачи. Я попытался составить запрос для вашей структуры, но безуспешно.
P.S. В будущем я рекомендую использовать команду SHOW FIELDS FROM таблица
для того чтобы поделиться с нами структурой вашей базы данных.
Я предлагаю изменить структуру вашей базы данных для достижения желаемого результата. Ниже приведены SQL-запросы для создания таблиц, которые вы можете использовать сразу же. Плюс это поможет сделать информацию о структуре более полной.
CREATE TABLE Publishers (
PublisherID INT PRIMARY KEY,
PublisherName VARCHAR(50)
);
CREATE TABLE Categories (
CategoryID INT PRIMARY KEY,
CategoryName VARCHAR(50)
);
CREATE TABLE Games (
GameID INT PRIMARY KEY,
GameName VARCHAR(50),
PublisherID INT,
CategoryID INT,
ReleaseDate DATE,
FOREIGN KEY (PublisherID) REFERENCES Publishers(PublisherID),
FOREIGN KEY (CategoryID) REFERENCES Categories(CategoryID)
);
CREATE TABLE Purchases (
PurchaseID INT PRIMARY KEY,
GameID INT,
PurchaseDate DATE,
PurchasePrice DECIMAL(10,2),
FOREIGN KEY (GameID) REFERENCES Games(GameID)
);
С такой структурой таблиц, запрос для вывода 3-x самых продаваемых категорий для каждого издателя будет таким:
WITH purchase_count AS (
SELECT p.PublisherID, c.CategoryID, COUNT(*) AS PurchaseCount
FROM Purchases pur
JOIN Games g ON g.GameID = pur.GameID
JOIN Publishers p ON p.PublisherID = g.PublisherID
JOIN Categories c ON c.CategoryID = g.CategoryID
GROUP BY p.PublisherID, c.CategoryID
),
ranked_categories AS (
SELECT PublisherID, CategoryID, PurchaseCount,
RANK() OVER (PARTITION BY PublisherID ORDER BY PurchaseCount DESC) AS CategoryRank
FROM purchase_count
)
SELECT r.PublisherID, p.PublisherName,
r.CategoryID, c.CategoryName,
r.PurchaseCount
FROM ranked_categories r
JOIN Publishers p ON p.PublisherID = r.PublisherID
JOIN Categories c ON c.CategoryID = r.CategoryID
WHERE r.CategoryRank <= 3;