只是一个快速的,希望......
我是从一个表中按月获得一些总计(销售额)。
我遇到的问题是: 如果一个月没有销售,那么当然不会在结果中返回月份。有没有办法可以在一个查询中执行此操作,因此如果没有销售,即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中的日期范围然后查询每个月和每年的情况下这样做...这只是看起来很乱......所以我想知道我是否可以在一个查询中执行此操作
非常感谢任何帮助!
答案 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)
这不能保证有效(取决于数据)。但如果确实如此,这是解决这个问题的最简单方法。