当我在SQL中有月份和年份时,如何将收入分成财务季度?
这是我走了多远,不知道我把它放在哪里。如你所见,我是SQL noob
CASE
WHEN month in (1,2,3) and year = 2012 then 'Q1 2012'
WHEN month in (4,5,6) and year = 2012 then 'Q2 2012'
WHEN month in (7,8,9) and year = 2012 then 'Q3 2012'
WHEN month in (10,11,12) and year = 2012 then 'Q4 2012'
WHEN month in (1,2,3) and year = 2013 then 'Q1 2013'
WHEN month in (4,5,6) and year = 2013 then 'Q2 2013'
WHEN month in (7,8,9) and year = 2013 then 'Q3 2013'
WHEN month in (10,11,12) and year = 2013 then 'Q4 2013'
WHEN month in (1,2,3) and year = 2013 then 'Q1 2014'
WHEN month in (4,5,6) and year = 2013 then 'Q2 2014'
END
答案 0 :(得分:1)
SELECT year, CONCAT("Q", CONVERT(VARCHAR(2), CEILING(month / 3))) AS quarter, revenue
FROM mytable
GROUP BY year, quarter
如果没有关于你的表或数据库的更多信息,这很难说,但这里的数据库与数据库无关,希望能够明白这一点。
不是使用复杂的CASE WHEN
,而是简单地将月份除以3,然后向上舍入,这有效地为我提供了季度。
答案 1 :(得分:0)
尝试从基于集合的角度来看待它。这就是RDBMS擅长的东西。
让自己成为Quarter
表。与其他开发人员阅读您的代码一样,它的可维护性和可读性更强。使用远远超出未来的数据(比如说从现在开始的50年)预先填充这个数据,您永远不必担心它。如果/当业务在日历上转移/调整其财务季度时,您通过修改适合的行来完成调整的工作,并且您对过去/历史的查询将继续准确,因为存在季度那时候。
CREATE TABLE Quarter(ID INT, [Desc] varchar(100),
QuarterStart DATETIME, QuarterEnd DATETIME);
INSERT INTO Quarter(QuarterStart, QuarterEnd, [Desc])
VALUES ('Jan 1 2012', 'Mar 31 2012', 'Q1 2012');
INSERT INTO Quarter(QuarterStart, QuarterEnd, [Desc])
VALUES ('Apr 1 2012', 'Jun 30 2012', 'Q2 2012');
使用PK明显调整,并为此表创建一次索引,然后重新设置。
然后,根据您的任何查询,将此表与您的销售数据相关联。 e.g。
SELECT SUM(SalesAmount) AS QuarterSales,
Q.Desc AS InQuarter
FROM Sales
JOIN Quarter AS Q
WHERE S.SalesDate BETWEEN Q.QuarterStart AND Q.QuarterEnd
GROUP BY Q.Desc;