我在iTunes,Google Play和Microsoft上有以下优惠表:
`offers`
- id
- Title
- Year
- Platform
- Offer
示例条目可能类似于:
(1, 'Titanic', 1997, 'iTunes', 'HDBUY')
这意味着电影名称Titanic(1997)可以在iTunes上用于HDBUY。
我有多个平台,我想将iTunes与其他平台进行比较,看看哪个平台每个标题有更多优惠。理想情况下,我的查询结果如下所示:
Title Year iTunes_Offers Top_Platform_Offers Top_Platform
Titanic 1997 HDBUY,SDBUY HDBUY,SDBUY,SDRENT Microsoft
Avatar 2009 HDBUY Google
这是一个包含要测试的样本数据的模式:
CREATE TABLE `offers` (
`id` varchar(20) DEFAULT NULL,
`Title` varchar(100) DEFAULT NULL,
`Year` varchar(20) DEFAULT NULL,
`Platform` varchar(100) DEFAULT NULL,
`Offer` varchar(20) DEFAULT NULL
);
INSERT INTO `offers` (`id`, `Title`, `Year`, `Platform`, `Offer`)
VALUES
('1', 'Titanic', '1997', 'iTunes', 'HDBUY'),
('1', 'Titanic', '1997', 'iTunes', 'SDBUY'),
('2', 'Titanic', '1997', 'Microsoft', 'SDBUY'),
('2', 'Titanic', '1997', 'Microsoft', 'HDBUY'),
('2', 'Titanic', '1997', 'Microsoft', 'SDRENT'),
('3', 'Titanic', '1997', 'Google', 'HDBUY'),
('4', 'Avatar', '2009', 'Google', 'HDBUY');
通过执行以下查询,我可以获得所有每个平台的优惠:
SELECT Title, Year, Platform, GROUP_CONCAT(Offer) GROUP BY id
这给了我:
id Title Year Platform Offer group_concat(offer)
1 Titanic 1997 iTunes HDBUY HDBUY,SDBUY
2 Titanic 1997 Microsoft SDBUY SDBUY,HDBUY,SDRENT
3 Titanic 1997 Google HDBUY HDBUY
4 Avatar 2009 Google HDBUY HDBUY
但我不太确定如何聚合它,因此我可以将三列合并在一起,iTunes_Offers
,Top_Platform_Offers
和Top_Platform
。为了在平台之间进行分组,我想通过CONCAT(标题,年份)进行汇总 - 例如,“Psycho(2005)”是一部与“Psycho(1960)”不同的电影。
我将如何做到这一点?
答案 0 :(得分:3)
您可以使用条件聚合:
SELECT Title, Year, Platform,
GROUP_CONCAT(CASE WHEN platform = 'iTunes' THEN Offer END) AS iTunes,
GROUP_CONCAT(CASE WHEN platform = 'Microsoft' THEN Offer END) AS Microsoft,
GROUP_CONCAT(CASE WHEN platform = 'Google' THEN Offer END) AS Google
FROM offers
GROUP BY CONCAT(title,year);
如果您有重复项,请使用GROUP_CONCAT(DISTINCT . . .)
。