2017-07-28 84 views
0

我目前有这样的代码,我想根据年份总结每个数量。我写了一个代码,我认为它会在2016年和2017年总结所有费用,但它运行不正确。总和基于日期

我添加了两种不同类型的partition by语句来测试,看看是否有效,他们不会。当我把它们拿出来时,“年鉴”专栏只给我显示特定收据的数量。

这里是我当前的代码:

SELECT 
    ReceiptNumber 
    ,Quantity 
    ,Date 
    ,sum(CASE WHEN (Date >= '2016-01-01' and Date < '2017-01-01') THEN 
     Quantity 
     ELSE 0 END) 
     OVER (PARTITION BY Date) 
     as Annual2016 
    ,sum(CASE WHEN (Date >= '2017-01-01' and Date < '2018-01-01') THEN 
     Quantity 
     ELSE 0 END) 
     OVER (PARTITION BY ReceiptNumber) 
     as Annual2017 
FROM Table1 
GROUP BY ReceiptNumber, Quantity, Date 

我想我的数据看起来像这样

ReceiptNumber Quantity Date   Annual2016 Annual2017 
1    5   2016-01-05  17   13 
2    11   2017-04-03  17   13 
3    12   2016-11-11  17   13 
4    2   2017-09-09  17   13 

下面是一些数据的样本,我从拉:

ReceiptNumber Quantity Date   
1    5   2016-01-05 
2    11   2017-04-03 
3    12   2016-11-11 
4    2   2017-09-09 
5    96   2015-07-08 
6    15   2016-12-12 
7    24   2016-04-19 
8    31   2017-01-02 
9    10   2017-0404 
10    18   2015-10-10 
11    56   2017-06-02 
+2

你可以添加一些数据样本? – Horaciux

+0

使用临时表或VALUES作为测试数据 –

+1

删除'PARTITION BY'。即'OVER()',您已经过滤了CASE中的年份) – dnoeth

回答

3

试试这个样子

Select 
.. 
sum(CASE WHEN (Date >= '2016-01-01' and Date < '2017-01-01') THEN 
     Quantity 
     ELSE 0 END) 
     OVER() as Annual2016 
sum(CASE WHEN (Date >= '2017-01-01' and Date < '2018-01-01') THEN 
     Quantity 
     ELSE 0 END) 
     OVER()as Annual2017 
.. 
Where Date >= '2016-01-01' and Date < '2018-01-01' 
+0

这工作完美。有什么办法可以让它只在顶部打印一次? – nola94

+1

@ nola94这不是SQL Server的工作,你可以在你的应用程序中管理它。我通常用两个模型和两个存储过程来做到这一点。一个返回数据,一个返回计数。将两个模型组合成一个视图模型,并且您拥有所需的一切。可爱的东西。 – Leonidas199x

+0

@ nola94 - 如上所述..尽管它可以在sql中实现,但它必须在应用程序层完成。 –

0

您需要一些条件合计超过窗口合计。简单地删除这两个PARTITION BY因为你已经在CASE过滤年:

SELECT 
    ReceiptNumber 
    ,Quantity 
    ,Date 
    ,sum(CASE WHEN (Date >= '2016-01-01' and Date < '2017-01-01') THEN 
     Quantity 
     ELSE 0 END) 
     OVER() as Annual2016 
    ,sum(CASE WHEN (Date >= '2017-01-01' and Date < '2018-01-01') THEN 
     Quantity 
     ELSE 0 END) 
     OVER() as Annual2017 
FROM Table1 

你可能不如果你想让它在顶部打印一次,那么你应该运行所需要的最终GROUP BY ReceiptNumber, Quantity, Date

1

它在一个单独的查询,如:

SELECT YEAR(Date) y, sum(Quantity) s FROM Table1 GROUP BY YEAR(Date) 

,然后执行主查询是这样的:

SELECT * FROM table1 

简单,peasey ... ;-)

你原来的问题也可以用回答:

SELECT *, 
(SELECT SUM(Quantity) FROM Table1 WHERE YEAR(Date)=2016) Annual2016, 
(SELECT SUM(Quantity) FROM Table1 WHERE YEAR(Date)=2017) Annual2017 
FROM table1