2012-05-04 29 views
2

(使用SQL Server 2008)如果我構建視圖,然後對視圖進行查詢,但我想在一個SQL查詢中執行此操作,我可以很容易地獲得此功能。我有一個包含兩列(DeliveredDate(DateTime),Delivered(Varchar))的表。我首先將DeliveredDate僅轉換爲日期,然後按日期分組。與此同時,我正在執行計數交付(列是YES或NULL)。以下是我用它來完成這個部分:按日期分組的SQL運行總數

SELECT CAST([DeliveredDate] As Date), 
     COUNT([Delivered]) 
    FROM [TableName] 
    GROUP BY CAST([DeliveredDate] As Date) 
    ORDER BY CAST([DeliveredDate] As Date) 

作爲輸出,我得到的是這樣的:

DeliveredDate | Delivered 
2012-04-24   10 
2012-04-25   500 
2012-04-26   422 
2012-04-27   33 

我正在尋找的是這樣的:

DeliveredDate | Delivered | RunningTotal 
2012-04-24   10   10 
2012-04-25   500   510 
2012-04-26   422   932 
2012-04-27   33   965 

我已經嘗試過我在那裏看到過的各種示例,但似乎沒有一個匹配執行Count和RunningTotal計數的場景。

+2

這是有幫助的說,你正在使用的RDBMS 。 – Marc

+0

SQL Server 2008 – JasonH

回答

1

我不知道,如果一個CTE算作一個看法,但是,這將在SQL 2005+不支持責令OVER子句SUM工作,

WITH cte (DeliveredDate, Delivered) 
    AS (SELECT Cast([DeliveredDate] AS DATE) DeliveredDate, 
       Count([Delivered]) Delivered 
     FROM [TableName] 
     GROUP BY Cast([DeliveredDate] AS DATE)) 
SELECT d1.delivereddate, 
     d1.delivered, 
     Sum(d2.Delivered) RunningTotal 
FROM cte d1 
     LEFT JOIN cte d2 
     ON d1.delivereddate >= d2.DeliveredDate 
GROUP BY d1.delivereddate, 
      d1.delivered 
ORDER BY d1.delivereddate 
+0

這段代碼有問題,但我喜歡你要去的地方。我認爲cte和d1之間應該有一個空格,然後我認爲第二個Group By應該是Order By?當我運行這個,我得到「沒有專欄名稱被指定爲'cte'的第1列」 – JasonH

+0

@JasonH對此抱歉。我更關心[測試運行總數](http://sqlfiddle.com/#!3/0eae2/3),我搞砸了CTE。現在應該全部修好了 –

+0

非常感謝,認真的,昨天我全腦筋都在這個上面 – JasonH

3

如果您使用的是實現有序OVER子句SUM一個產品,你可以做這樣的事情:

select 
    cast(DeliveredDate as date) as DeliveredDate, 
    count(Delivered) as Delivered, 
    sum(count(Delivered)) over (
    order by DeliveredDate 
) as RunningTotal 
from Orders 
group by OrderDate 
order by OrderDate; 

你表達計數(交付)是有點奇怪。只要確定它是你想要的就可以了:它會計算特定日期的行數,Delivered列中的值不是NULL。

+0

這個答案在我的情況下不起作用,我不相信在我正在使用的SQL版本中支持。 – JasonH

+0

SQL Server 2008支持'OVER',但我不認爲它支持'OVER'中的'ORDER BY'作爲聚合函數。 – Chad

+0

SQL Server僅支持SQL Server 2012以上版本。 –