2012-04-17 83 views
1

想知道是否有人可以帮助解决这个问题。 我想要查询数据并获得2个条目,一个用于上年至今年,另一个用于今年至今。前几年和今年的SQL YTD

唯一的方法,我知道如何做到这一点是作为2个单独的查询与where子句..我宁愿不必运行查询两次。

一列名为DatePeriod,并填充2011年YTD和2012YTD,如果我能做到2011YTD,2012YTD,2011Total,2012Total ...会更好,尽管猜测这是4个查询。

感谢

编辑: 针对帮助清除一些事情: 这是在MS SQL被编码。

的数据看起来像这样:(非常基本的例子)

Date  | Call_Volume 
1/1/2012 | 4 

我想什么是有Call_Volume总结出来的,我有按月做查询该组是按周,和其他人。我可以将所有样片放入Excel中,并在Excel中执行此操作,但表格中有数百万行,因此总是最好减小我的输出大小。

我目前按周/月和年和联盟分组,所以它的1输出。但这意味着我有3个查询访问同一个表,很大的痛苦,非常慢并且没有效率,这很好,但是现在我还需要一个YTD,所以它可以多一个查询,或者如果我能找到一种方法将它添加到年度查询中那会理想:

所以

DatePeriod | Sum_Calls 
2011 Total | 40 
2011 YTD  | 12 
2012 Total | 45 
2012 YTD  | 15 

希望这是任何意义。

+0

请将您的“2个单独的查询”以及@bluefeet提到的内容一起发布 – Seph 2012-04-17 17:25:26

回答

1

SQL是建立在做,不操作(您选择列,当然,但总的操作都在行)。

最标准的做法,这是一样的东西:

SELECT SUM(your_table.sales), YEAR(your_table.sale_date) 
FROM your_table 
GROUP BY YEAR(your_table.sale_date) 

现在你会得到一个行每年的记录,没有限制,你可以多少年处理。如果你已经被另一个领域分组了,那很好;那么您将在每个组中每年获得一行。

然后,您的程序可以遍历行并按照您的喜好组织/呈现它们。

如果你绝对,肯定必须有列,而不是,你会用东西卡这样的:

SELECT SUM(IF(YEAR(date) = 2011, sales, 0)) AS total_2011, 
    SUM(IF(YEAR(date) = 2012, total_2012, 0)) AS total_2012 
FROM your_table 

如果你正在构建的查询程序,你可以添加尽可能多的这些列的标准为您需要,但我不会指望这个运行非常有效。 (这些例子是用一些特定于MySQL的函数编写的,其他引擎也有相应的函数,但是语法稍有不同。)