2017-07-28 114 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