MySQL select 个不同日期的报表

MySQL select statements across different dates

我有一个 table,看起来像这样:

Month/Year id url     kw_count IMP CLK POS CTR 
Aug-2018    1 /url-1       222 444 122   4 1.2 
Sept-2018   2 /url-1       232 534 123   4 1.2 
Oct-2018    3 /url-1       224 445 124   4 1.2 
Nov-2018    4 /url-1       212 478 125   4 1.2 
Aug-2018    5 /url-2       233 434 126   4 1.2 
Sept-2018   6 /url-2       311 433 128   4 1.2 
Oct-2018    7 /url-2       299 423 123   4 1.2 
Nov-2018    8 /url-2       232 411 122   4 1.2 
Dec-2018    9 /url-2       231 465 156   5 1.1 

我想 select 所有独特的 url 及其两个月的指标。像这样的…… 2018 年 8 月和 9 月…

/url-1, kw_count (aug), kw_count (sept), imp (aug), img (sept)... 等然后 url-2

相同

我不会事先知道 URL,它只是 select 基于 select 编辑的日期。

我这辈子都想不出我该怎么做。我和 group by 和其他人一起玩过,但我很挣扎。

我该怎么做?

您的 table 包含每月记录和 url。现在 select 一个月,再 select 一个月,加入两个数据集就完成了。那将是:

select *
from (select * from mytable where month_year = 'Aug-2018') m201808
full outer join (select * from mytable where month_year = 'Sept-2018') m201809 using (url);

由于 MySQL 不支持完全外部联接,我们必须先获取 url,然后两个月都进行外部联接:

select *
from (select distinct url from mytable where month_year in ('Aug-2018', 'Sept-2018')) urls
left join (select * from mytable where month_year = 'Aug-2018') m201808 using (url)
left join (select * from mytable where month_year = 'Sept-2018') m201809 using (url);

当然,您应该将 select * 替换为列名:

select
  url,
  m201808.kw_count as kw_count_201808,
  m201809.kw_count as kw_count_201809,
  ...

像这样应该可以满足您的要求:

SELECT url, 
    SUM(CASE WHEN `Month\Year` = 'Aug-2018' THEN kw_count END) AS `kw_count (Aug)`,
    SUM(CASE WHEN `Month\Year` = 'Sep-2018' THEN kw_count END) AS `kw_count (Sep)`,
    SUM(CASE WHEN `Month\Year` = 'Aug-2018' THEN IMP END) AS `IMP (Aug)`,
    SUM(CASE WHEN `Month\Year` = 'Sep-2018' THEN IMP END) AS `IMP (Sep)`,
    SUM(CASE WHEN `Month\Year` = 'Aug-2018' THEN CLK END) AS `CLK (Aug)`,
    SUM(CASE WHEN `Month\Year` = 'Sep-2018' THEN CLK END) AS `CLK (Sep)`,
    SUM(CASE WHEN `Month\Year` = 'Aug-2018' THEN POS END) AS `POS (Aug)`,
    SUM(CASE WHEN `Month\Year` = 'Sep-2018' THEN POS END) AS `POS (Sep)`,
    SUM(CASE WHEN `Month\Year` = 'Aug-2018' THEN CTR END) AS `CTR (Aug)`,
    SUM(CASE WHEN `Month\Year` = 'Sep-2018' THEN CTR END) AS `CTR (Sep)`
FROM metrics
GROUP BY url

输出(对于您的示例数据):

url     kw_count (Aug)  kw_count (Sep)  IMP (Aug)   IMP (Sep)   CLK (Aug)   CLK (Sep)   POS (Aug)   POS (Sep)   CTR (Aug)   CTR (Sep)
/url-1  222             232             444         534         122         123         4           4           1           1
/url-2  233             311             434         433         126         128         4           4           1           1

构建查询时,您需要适当调整日期和列名。我创建了一个演示 SQLFiddle 来玩(如果您发布文本而不是数据图像会容易得多!)。