如果月份缺失,即使是月份也是如此

时间:2015-01-27 23:46:47

标签: php mysql

只是一个快速的,希望......

我是从一个表中按月获得一些总计(销售额)。

我遇到的问题是: 如果一个月没有销售,那么当然不会在结果中返回月份。有没有办法可以在一个查询中执行此操作,因此如果没有销售,即2015年1月和#34;结果将返回" 0.00 - 2015年1月 - "

我目前拥有的基本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中的日期范围然后查询每个月和每年的情况下这样做...这只是看起来很乱......所以我想知道我是否可以在一个查询中执行此操作

非常感谢任何帮助!

3 个答案:

答案 0 :(得分: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;

不管我是否在这里讨论了这些问题,这个概念都应该为你提供支持

答案 1 :(得分: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查询中保留所有内容,我个人会选择他的方法。

答案 2 :(得分: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)

这不能保证有效(取决于数据)。但如果确实如此,这是解决这个问题的最简单方法。