Mysql 即使没有该月份的记录,如何从查询中获取所有月份?
我有一个查询来获取一年中各个月的所有收入总和,但我想从没有记录的月份中获取零,我可以从查询中执行此操作吗 这是我现在的问题:Mysql 即使没有该月份的记录,如何从查询中获取所有月份?,mysql,laravel,Mysql,Laravel,我有一个查询来获取一年中各个月的所有收入总和,但我想从没有记录的月份中获取零,我可以从查询中执行此操作吗 这是我现在的问题: $monthRevenueData = \CompanySubscription::selectRaw('SUM(billed_amount) as revenue, MONTHNAME(payment_date) as Month') ->groupBy(\DB::raw("YEAR(payment_date)"),\DB::raw("MONTH(paym
$monthRevenueData = \CompanySubscription::selectRaw('SUM(billed_amount) as revenue, MONTHNAME(payment_date) as Month')
->groupBy(\DB::raw("YEAR(payment_date)"),\DB::raw("MONTH(payment_date)"))
->orderBy(\DB::raw("MONTH(payment_date)"))->get();
输出:
我希望剩余月份的结果为0,即使该月份没有记录。使用CTE来规避此问题
with allmonths as (
select 'January' month,
union
select 'February' month
union
select ...
)
select * from yourtable y, allmonths x
where x.month = month(y.datefield);
或者你可以使用-
select COALESCE(your_table.revenue,0), allmonths.month from (
select 'January' month,
union
select 'February' month
union
select ...
) as allmonths
LEFT JOIN your_table on month(your_table.datefield) = allmonths.month;
MySQL CTE-无论数据库中的日期如何,都可以尝试此动态查询。您可以将其放入sqlfiddle中,自己或db fiddle对其进行测试 问题1 没有要显示的结果 问题2
创建一个月表,例如,left join it inI无法创建一个表我需要使用现有表。我可以不创建表就这样做吗?我对这方面比较陌生。你能解释一下我如何在查询中实现这一点吗?我没有单独的月份栏,我使用付款日期来获取月份和年份@苏迪普塔这里的CTE是什么?
select COALESCE(your_table.revenue,0), allmonths.month from (
select 'January' month,
union
select 'February' month
union
select ...
) as allmonths
LEFT JOIN your_table on month(your_table.datefield) = allmonths.month;
CREATE TABLE Bookings
(`id` int, `price` int, `date` date)
;
INSERT INTO Bookings
(`id`, `price`, `date`)
VALUES
(1, 1200, '2017-01-01'),
(2, 400, '2017-01-14'),
(3, 300, '2017-02-04'),
(4, 650, '2017-02-17'),
(5, 240, '2017-02-22'),
(6, 240, '2017-04-22'),
(7, 1240, '2017-08-25')
;
SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
SELECT DATE_FORMAT(aux.d,'%Y-%m-01') as mth, DATE_FORMAT(aux.d,'%b %Y') as mth, t.price FROM
(
SELECT CONVERT( @d := DATE_ADD(@d, INTERVAL 1 MONTH), DATE ) AS d
FROM Bookings a,
(
SELECT @d := ( SELECT DATE_SUB(MIN(DISTINCT(a.date)) , INTERVAL 1 MONTH ) FROM Bookings a )
) x
WHERE @d <= ( SELECT DATE_SUB(MAX(DISTINCT(a.date)) , INTERVAL 1 MONTH ) FROM Bookings a )
) aux
LEFT JOIN
(
SELECT DATE_FORMAT(date, '%b %Y' ) as mth2,
DATE_FORMAT(date, '%Y-%m-01' ) as mth1,
sum(price) as price
FROM Bookings
GROUP BY DATE_FORMAT(date, '%Y-%m-01')
ORDER BY mth1 ASC
) as t
ON t.mth1=aux.d
ORDER BY aux.d ASC;
| mth | price |
| -------- | ----- |
| Jan 2017 | 1600 |
| Feb 2017 | 1190 |
| Mar 2017 | |
| Apr 2017 | 240 |
| May 2017 | |
| Jun 2017 | |
| Jul 2017 | |