SQL YTD前几年和今年

时间:2012-04-17 17:22:45

标签: sql sql-server

想知道是否有人可以为此提供帮助。 我想查询数据并得到2个条目,一个是YTD去年,一个是今年YTD。

我知道如何做到的唯一方法是使用where子句进行2次单独查询..我宁愿不必再运行两次查询。

一个名为DatePeriod的专栏,填充了2011 YTD和2012YTD,如果我能做到2011YTD,2012YTD,2011Total,2012Total,那将会更好......虽然猜测这是4个查询。

由于

编辑: 为了帮助澄清一些事情: 这是用MS SQL编写的。

数据如下所示:(非常基本的例子)

Date       |   Call_Volume
1/1/2012   |   4

我想要的是Call_Volume总结,我有查询按周分组,还有其他人按月分组。我可以将所有样片都拉进去并在Excel中执行此操作但表格中有数百万行,因此总是最好减小输出的大小。

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

所以

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

希望这有任何意义。

1 个答案:

答案 0 :(得分: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的函数编写的。其他引擎存在相应的函数,但语法会略有不同。)