2017-08-04 167 views
2

我正在使用以下數據和SQL編寫存儲過程。當我執行下面的SQL時,我得到每個月的計數,但是我希望計數在下個月做時加總。我想爲查詢添加一個額外的列(Totalcount),我期待如下所示的結果。提前致謝!總數計算

Month_NUMBER MonthlyCount Totalcount 
-------------------------------------- 
    1    4    4 
    2    1    5 
    3    1    6 
    4    2    8 

這是我目前使用SQL:

drop table #test 

create table #test (name varchar(10), MON_NUMBER int) 

insert into #test 
values ('XYZ', 1), ('ABC', 1), ('AZZ', 1), ('BCC', 1), 
     ('HAS', 2), ('MRD', 3), ('GIV', 4), ('GIVE', 4) 

SELECT 
    MON_NUMBER, 
    COUNT(NAME) AS MonthlyCount 
FROM 
    #test 
GROUP BY 
    MON_NUMBER 

回答

2

您可以使用您的查詢,如下:

Select *, Sum(MonthlyCount) over(order by Mon_nUmber) from (
    SELECT MON_NUMBER, COUNT(NAME) AS MonthlyCount 
    FROM #test 
    group by MON_NUMBER 
) a 

輸出如下:


+------------+--------------+------------+ 
| MON_NUMBER | MonthlyCount | TotalCount | 
+------------+--------------+------------+ 
|   1 |   4 |   4 | 
|   2 |   1 |   5 | 
|   3 |   1 |   6 | 
|   4 |   2 |   8 | 
+------------+--------------+------------+ 
+0

SUM()OVER(ORDER BY ...)僅適用於以SQL2012 + –

1

[0]這類型計算的值被命名運行總數。

[1] SUM()OVER(ORDER BY ...)僅開始SQL2012 +

[2]下面的解決方案應該是蠻好的舊版本(這裏包括SQL2008)和少量數據:

create table #test (name varchar(10), MON_NUMBER int) 

insert into #test 
values ('XYZ', 201701), ('ABC', 201701), ('AZZ', 201701), ('BCC', 201701), 
     ('HAS', 201702), ('MRD', 201703), ('GIV', 201704), ('GIVE', 201704) 

;WITH BaseQuery 
AS (
SELECT 
    MON_NUMBER, 
    COUNT(NAME) AS MonthlyCount 
FROM 
    #test 
GROUP BY 
    MON_NUMBER 
) 
SELECT *, (
      SELECT SUM(x.MonthlyCount) FROM BaseQuery x 
      WHERE x.MON_NUMBER <= bq.MON_NUMBER 
     ) AS MonthlyCountRunningTotal 
FROM BaseQuery bq 
1

您可以使用自聯接在SQL Server 2008:

WITH CTE AS (
    SELECT MON_NUMBER, COUNT(NAME) AS MonthlyCount 
    FROM #test 
    group by MON_NUMBER 
) 
SELECT C1.MON_NUMBER, C1.MonthlyCount, SUM(C2.MonthlyCount) AS TotalCount 
FROM CTE C1 
JOIN CTE C2 ON C1.MON_NUMBER >= C2.MON_NUMBER 
GROUP BY C1.MON_NUMBER, C1.MonthlyCount 
ORDER BY C1.MON_NUMBER, C1.MonthlyCount; 
0

@ S.Yang已經給出了最好的和適當的答案。由於SUM()窗口函數不能在SQL Server 2008中使用,因此您必須使用自連接。基於他的回答,我提交了另一個解決方案,該解決方案通過不使用CTE而對大型數據集非常有用。

IF OBJECT_ID(N'dbo.temp', N'U') IS NOT NULL DROP TABLE dbo.temp; 
SELECT MON_NUMBER, COUNT(NAME) AS MonthlyCount 
INTO dbo.temp 
FROM #test 
GROUP BY MON_NUMBER; 

-- Create Index 
CREATE INDEX IX_dbo_temp ON dbo.temp (MON_NUMBER, MonthlyCount); 

SELECT t1.MON_NUMBER, t1.MonthlyCount, SUM(t2.MonthlyCount) AS TotalCount 
FROM dbo.temp AS t1 
INNER JOIN dbo.temp AS t2 ON (t2.MON_NUMBER <= t1.MON_NUMBER) 
GROUP BY t1.MON_NUMBER, t1.MonthlyCount; 

-- Drop temporary tables 
IF OBJECT_ID(N'dbo.temp', N'U') IS NOT NULL DROP TABLE dbo.temp;