这是我的桌子。
SELECT
Financials.CountryID,
Financials.ProductID,
SUM(Financials.Revenue) AS total
FROM Financials
INNER JOIN (SELECT
CountryID,
GROUP_CONCAT (ProductID ORDER BY Revenue DESC) grouped_ID
FROM Financials
GROUP BY CountryID) group_max
ON Financials.CountryID = group_max.CountryID
AND FIND_IN_SET(ProductID, grouped_ID) BETWEEN 1 AND 6
GROUP BY Financials.ProductID
ORDER BY Financials.CountryID, total DESC
我需要按每个国家/地区的收入查找前5名产品。有些产品会不止一次上市,所以我需要将每种产品的收入加起来。
CREATE TABLE mysql_test (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
CountryID VARCHAR(30) NOT NULL,
ProductID VARCHAR(30) NOT NULL,
Revenue VARCHAR(50),
cost VARCHAR(50),
reg_date TIMESTAMP
);
CREATE TABLE mysql_test_sql (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
CountryID VARCHAR(30) NOT NULL,
ProductID VARCHAR(30) NOT NULL,
Revenue VARCHAR(50),
cost VARCHAR(50),
reg_date TIMESTAMP
);
INSERT INTO `mysql_test` (`id`, `CountryID`, `ProductID`, `Revenue`, `cost`, `reg_date`) VALUES ('1', 'Canada', 'Doe', '20', '5', '2010-01-31 12:01:01');
INSERT INTO `mysql_test` (`id`, `CountryID`, `ProductID`, `Revenue`, `cost`, `reg_date`) VALUES ('2', 'USA', 'Tyson', '40', '15', '2010-02-14 12:01:01');
INSERT INTO `mysql_test` (`id`, `CountryID`, `ProductID`, `Revenue`, `cost`, `reg_date`) VALUES ('3', 'France', 'Keaton', '80', '25', '2010-03-25 12:01:01');
INSERT INTO `mysql_test` (`id`, `CountryID`, `ProductID`, `Revenue`, `cost`, `reg_date`) VALUES ('4', 'France', 'Joe', '180', '45', '2010-04-25 12:01:01');
INSERT INTO `mysql_test` (`id`, `CountryID`, `ProductID`, `Revenue`, `cost`, `reg_date`) VALUES ('5', 'France', 'Bill', '30', '6', '2010-04-25 12:01:01');
INSERT INTO `mysql_test` (`id`, `CountryID`, `ProductID`, `Revenue`, `cost`, `reg_date`) VALUES ('6', 'France', 'Emma', '15', '2', '2010-04-25 12:01:01');
INSERT INTO `mysql_test` (`id`, `CountryID`, `ProductID`, `Revenue`, `cost`, `reg_date`) VALUES ('7', 'France', 'Joe', '60', '36', '2010-04-25 12:01:01');
INSERT INTO `mysql_test` (`id`, `CountryID`, `ProductID`, `Revenue`, `cost`, `reg_date`) VALUES ('8', 'France', 'Jammer', '130', '26', '2010-04-25 12:01:01');
INSERT INTO `mysql_test` (`id`, `CountryID`, `ProductID`, `Revenue`, `cost`, `reg_date`) VALUES ('9', 'France', 'Louis', '350', '12', '2010-04-25 12:01:01');
INSERT INTO `mysql_test` (`id`, `CountryID`, `ProductID`, `Revenue`, `cost`, `reg_date`) VALUES ('10', 'France', 'dennis', '100', '175', '2010-04-25 12:01:01');
INSERT INTO `mysql_test` (`id`, `CountryID`, `ProductID`, `Revenue`, `cost`, `reg_date`) VALUES ('11', 'USA', 'zooey', '70', '16', '2010-04-25 12:01:01');
INSERT INTO `mysql_test` (`id`, `CountryID`, `ProductID`, `Revenue`, `cost`, `reg_date`) VALUES ('12', 'France', 'Alex', '2', '16', '2010-04-25 12:01:01');
这是我到目前为止所做的。它不起作用。帮助
修改
我一直在使用https://sqltest.net/。请参阅我用户下面的插入命令
self.sortedTableArray.sort(by: {
if $0.date != $1.date {
return $0.date < $1.date
} else {
return $0.id.localizedStandardCompare($1.id) == .orderedAscending
}
})
答案 0 :(得分:0)
这是一种方法:
select countryId,
substring_index(group_concat(productId order by revenue desc), ',', 5) as top5
from (select countryId, productId, sum(revenue) as revenue
from mysql_test
group by countryId, productId
) cp
group by countryId;
注意:group_concat()
的中间结果的默认内部限制约为1028个字符。这应该适用于每个国家几百个产品。默认长度是系统设置,可以更改。