2015-01-27 2 views
0

просто быстро один, надеюсь ....итоги по месяцам даже для если есть недостающий месяц

я после того, как получить некоторые итоги (стоимость продажи) в месяц только из одной таблицы.

Проблема у меня есть: Если нет продаж за месяц, месяц, конечно, не возвращается в результатах. Есть ли способ, я могу сделать это в одном запросе, так что если не было продаж в ИЭ «января 2015» результат будет возвращать «0,00 - январь - 2015»

Основной SQL я в настоящее время является:

SELECT SUM(p.PaymentAmount) AS Total, MONTHNAME(p.PaymentDate) AS Month, YEAR(p.PaymentDate) AS Year 
FROM tPayment p 
WHERE p.PaymentType = 2 
GROUP BY YEAR(p.PaymentDate), MONTH(p.PaymentDate) 

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

Любая помощь очень ценится!

+0

Вы можете добавить строку в январе с 0 в поле продаж. – developerwjk

+6

Было бы проблемой заполнить любые пробелы на стороне PHP? – Jon

+0

Рассмотрите [вложенные запросы] (http://www.tutorialspoint.com/sql/sql-sub-queries.htm). – dg99

ответ

1

вы должны создать себе отдельную таблицу, содержащую в сроки, такие как

CREATE TABLE `dates` (
    `uid` INT NOT NULL AUTO_INCREMENT, 
    `datestamp` DATE NOT NULL, 
PRIMARY KEY (`uid`)) 
ENGINE = InnoDB; 

и заполнить его

INSERT INTO dates (datestamp) 
SELECT ADDDATE('2015-01-01', INTERVAL SomeNumber DAY)#set start date 
FROM (SELECT a.i+b.i*10+c.i*100+d.i*1000 AS SomeNumber 
    FROM integers a, integers b, integers c, integers d) Sub1 
WHERE SomeNumber BETWEEN 0 AND (365 * 3)#3 years 

, то вы можете присоединиться против него

SELECT SUM(p.PaymentAmount) AS Total, MONTHNAME(p.PaymentDate) AS Month, YEAR(p.PaymentDate) AS Year 
FROM tPayment p 
LEFT OUTER JOIN dates d 
    ON d.datestamp = CAST(p.PaymentDate AS DATE) 
WHERE p.PaymentType = 2 
GROUP BY YEAR(p.PaymentDate), MONTH(p.PaymentDate) 
ORDER BY d.datestamp DESC; 

независимо от того, если я жирные вопросы здесь, концепция должна задержать вас

0

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

SELECT 
    SUM(p.PaymentAmount) AS Total, 
    MONTHNAME(p.PaymentDate) AS Month, 
    YEAR(p.PaymentDate) AS Year 
FROM (SELECT 1 AS m UNION ALL 
    SELECT 2 UNION ALL 
    SELECT 3 UNION ALL 
    SELECT 4 UNION ALL 
    SELECT 5 UNION ALL 
    SELECT 6 UNION ALL 
    SELECT 7 UNION ALL 
    SELECT 8 UNION ALL 
    SELECT 9 UNION ALL 
    SELECT 10 UNION ALL 
    SELECT 11 UNION ALL 
    SELECT 12 
) AS months 
OUTER JOIN tPayment p 
    ON MONTH(p.PaymentDate) = months.m 
WHERE p.PaymentType = 2 
GROUP BY YEAR(p.PaymentDate), MONTH(p.PaymentDate) 

Я думаю, что было бы легче проверить его в некотором быстром PHP-коде после запуска запроса.

Как предложено Jon B Создание таблицы Стол и соединение с ним сократят и очистят запрос совсем немного. Если вы пытаетесь сохранить все это в своем запросе MySQL, я лично выберу его метод.

0

Если у вас есть данные в таблице для всех месяцев - но пункт where фильтрует все строки из одного или нескольких месяцев - вы можете попробовать условную агрегацию:

SELECT SUM(CASE WHEN p.PaymentType = 2 THEN p.PaymentAmount ELSE 0 END) AS Total, 
     MONTHNAME(p.PaymentDate) AS Month, YEAR(p.PaymentDate) AS Year 
FROM tPayment p 
GROUP BY YEAR(p.PaymentDate), MONTH(p.PaymentDate) 

Это не гарантированно работает (это зависит от данных). Но если это так, это самый простой способ решить эту проблему.

+0

Почему downvote? –

+0

, который будет работать с текущими данными, но только потому, что будет хотя бы одна форма PaymentType. но это не сработало бы для меня, если бы в течение месяца не было ни одного платежа (хотя это никогда не произойдет), поэтому я буду полагаться на шанс, который может быть неправдой для меня .... (я не знаю, почему голосуя, казалось разумным предложением/вариантом для меня ... у меня было то же самое с некоторыми из моих вопросов в прошлом .... мы все должны чему-то учиться .....) – Ford

+0

@Ford. , , Это явно объяснено в ответе. Это просто более простой способ получить то, что вам нужно, что может быть возможно в зависимости от используемых данных. –

Смежные вопросы