聚合比较查询

时间:2016-10-13 02:07:02

标签: mysql sql

我在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_OffersTop_Platform_OffersTop_Platform。为了在平台之间进行分组,我想通过CONCAT(标题,年份)进行汇总 - 例如,“Psycho(2005)”是一部与“Psycho(1960)”不同的电影。

我将如何做到这一点?

1 个答案:

答案 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 . . .)