假设我正在搜索输入变量: $从:01-01-2016 $到:03-12-2016
这是我当前的表格:(outreach_links)
created_at start_date status
---------------------------------
2016-12-01 2016-01-01 A
2016-12-02 2016-02-01 A
2016-12-03 2016-03-01 A
2016-12-03 2016-04-01 A
2016-12-03 NULL P
2016-12-03 NULL P
2016-12-03 NULL P
查询后我想这样输出>>
Month P A
---------------------------
Jan/2016 0 1
Feb/2016 0 1
March/2016 0 1
April/2016 0 1
Dec/2016 3 0
逻辑是我想按 created_at 对 Status = "P"进行分组 我想按 start_date 对 Status="A"进行分组?我如何在查询中完成此操作?
这是我当前的 laravel 5.2 查询:
DB::select(
DB::raw('select
sum(case when outreach_links.status="P" and outreach_links.created_at >= ? and outreach_links.created_at <=? then 1 else 0 end) as pp,
sum(case when outreach_links.status="A" and outreach_links.start_date >= ? and outreach_links.start_date <=? then 1 else 0 end) as aa,
sum(case when outreach_links.status="A" then outreach_links.cost else 0 end) as cc,
MONTH(outreach_links.created_at) month,
MONTHNAME(outreach_links.created_at) month_name,
YEAR(outreach_links.created_at) year from outreach
inner join outreach_links on outreach.id = outreach_links.outreach_id
where outreach.profile_id=?
group by month, year'),
[$from, $to, $from, $to, $pro_id]
);
由于我仅按 (created_at) 分组,所以此输出是错误的:
Month P A
---------------------------
Dec/2016 3 4
这是我查询时的输出 >> var_dump();
array(1) {
[0]=>
object(stdClass)#369 (6) {
["pp"]=>
string(1) "3"
["aa"]=>
string(1) "4"
["cc"]=>
string(4) "0.00"
["month"]=>
string(2) "12"
["month_name"]=>
string(8) "December"
["year"]=>
string(4) "2016"
}
}
你能帮我修改查询吗?
谢谢
最佳答案
这样就可以了:
select concat(monthname(date), '/', year) as Month,
(select count(*) from test where year(created_at) = year and month(created_at) = month and status = 'P') as P,
(select count(*) from test where year(start_at) = year and month(start_at) = month and status = 'A') as A
from
(select year(created_at) as year, month(created_at) as month, created_at as date
from test where created_at >= ? and created_at <= ?
union
select year(start_at) as year, month(start_at) as month, start_at as date
from test where start_at >= ? and start_at <= ?) t1
group by year, month
order by date
基本上,它UNION
该表中的所有日期,并在此基础上执行分组依据
。
这是 SQL Fiddle .
关于php - Laravel 查询按两个不同的日期分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40921386/