将收入分成四分之一的逻辑

时间:2014-07-26 04:27:09

标签: sql

当我在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 

2 个答案:

答案 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;