Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 即使没有该月份的记录,如何从查询中获取所有月份?_Mysql_Laravel - Fatal编程技术网

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 |       |