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 来玩(如果您发布文本而不是数据图像会容易得多!)。
我有一个 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 来玩(如果您发布文本而不是数据图像会容易得多!)。