Как получить все месяцы из запроса, даже если в этом месяце нет записей? - PullRequest
0 голосов
/ 07 июня 2018

У меня есть запрос, чтобы получить всю сумму дохода за месяцы в году, но я хочу получить нули из месяцев, где нет записей, могу ли я сделать это из запроса?

Вот мой запрос прямо сейчас:

$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();

Вывод:

Month    revenue 
January  2000 
August   3000 
october  1000 

Я хочу, чтобы результаты за оставшиеся месяцы равнялись 0, даже если нет записиза этот месяц.

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Вы можете попробовать этот динамический запрос независимо от того, какая дата в базе данных.Вы можете поместить это в sqlfiddle, чтобы протестировать его самостоятельно или db-fiddle

https://www.db -fiddle.com / f / ncES6tKJ8KsAVZjSZCkhv / 1

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')
;

Запрос # 1

SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

Нет результатов для отображения.


Запрос # 2

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 |       |
0 голосов
/ 07 июня 2018

ИСПОЛЬЗУЙТЕ 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 - https://dev.mysql.com/doc/refman/8.0/en/with.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...