添加上个月的连续计数

问题描述 投票:0回答:2

是否有一种方法可以将前几个月的计数添加到下个月,例如,在下表中,Jan具有17和2月29,我需要2月显示46,3月显示46以及3月的实际计数。我需要跟踪进度。

SELECT  ReviewType,
    Count(CASE MONTH(dateCompleted) WHEN 1 THEN ReviewType END) AS Jan,
    Count(CASE MONTH(dateCompleted) WHEN 2 THEN ReviewType END) AS Feb,
    Count(CASE MONTH(dateCompleted) WHEN 3 THEN ReviewType END) AS Mar,
    Count(CASE MONTH(dateCompleted) WHEN 4 THEN ReviewType END) AS Apr,
    Count(CASE MONTH(dateCompleted) WHEN 5 THEN ReviewType END) AS May,
    Count(CASE MONTH(dateCompleted) WHEN 6 THEN ReviewType END) AS Jun,
    Count(CASE MONTH(dateCompleted) WHEN 7 THEN ReviewType END) AS Jul,
    Count(CASE MONTH(dateCompleted) WHEN 8 THEN ReviewType END) AS Aug,
    Count(CASE MONTH(dateCompleted) WHEN 9 THEN ReviewType END) AS Sep,
    Count(CASE MONTH(dateCompleted) WHEN 10 THEN ReviewType END) AS Oct,
    Count(CASE MONTH(dateCompleted) WHEN 11 THEN ReviewType END) AS Nov,
    Count(CASE MONTH(dateCompleted) WHEN 12 THEN ReviewType END) AS Dec,
count(ReviewType) AS Result
FROM SQL1.dbo.qryPeakReviews 
GROUP BY ReviewType 

Output:

ReviewType  Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec Result
    1   0   17  29  11  10  5   0   0   13  4   6   1   96
    2   0   2   20  5   4   3   0   3   6   5   0   0   48
    3   0   1   15  12  6   3   0   2   6   2   2   0   49
tsql
2个回答
0
投票

使用标准化数据集更容易:

WITH Counts AS(
    SELECT ReviewType,
           MONTH(dateCompleted) AS MonthNo,
           DATENAME(MONTH,dateCompleted) AS MonthName,
           COUNT(1) AS Total
    FROM dbo.qryPeakReviews
    GROUP BY ReviewType,
             MONTH(dateCompleted))
SELECT ReviewType,
       MonthName,
       SUM(Total) OVER (ORDER BY MonthNo ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS RunningTotal
FROM Counts
ORDER BY MonthNo;

如果您必须具有未标准化的数据集,则只需稍微更改交叉表:

SELECT ReviewType,
       COUNT(CASE WHEN MONTH(dateCompleted) <= 1 THEN ReviewType END) AS Jan,
       COUNT(CASE WHEN MONTH(dateCompleted) <= 2 THEN ReviewType END) AS Feb,
       COUNT(CASE WHEN MONTH(dateCompleted) <= 3 THEN ReviewType END) AS Mar,
       COUNT(CASE WHEN MONTH(dateCompleted) <= 4 THEN ReviewType END) AS Apr,
       COUNT(CASE WHEN MONTH(dateCompleted) <= 5 THEN ReviewType END) AS May,
       COUNT(CASE WHEN MONTH(dateCompleted) <= 6 THEN ReviewType END) AS Jun,
       COUNT(CASE WHEN MONTH(dateCompleted) <= 7 THEN ReviewType END) AS Jul,
       COUNT(CASE WHEN MONTH(dateCompleted) <= 8 THEN ReviewType END) AS Aug,
       COUNT(CASE WHEN MONTH(dateCompleted) <= 9 THEN ReviewType END) AS Sep,
       COUNT(CASE WHEN MONTH(dateCompleted) <= 10 THEN ReviewType END) AS Oct,
       COUNT(CASE WHEN MONTH(dateCompleted) <= 11 THEN ReviewType END) AS Nov,
       COUNT(CASE WHEN MONTH(dateCompleted) <= 12 THEN ReviewType END) AS Dec,
       COUNT(ReviewType) AS Result
FROM dbo.qryPeakReviews 
GROUP BY ReviewType;

0
投票

所以基本上,您需要累加的总和,您可以像这样实现它:

SELECT t1.ReviewType,
     (CASE MONTH(dateCompleted) WHEN 1 THEN SUM(count(t2.ReviewType)) END) AS Jan,
     (CASE MONTH(dateCompleted) WHEN 2 THEN SUM(count(t2.ReviewType)) END) AS Feb,
     (CASE MONTH(dateCompleted) WHEN 3 THEN SUM(count(t2.ReviewType)) END) AS Mar,
     (CASE MONTH(dateCompleted) WHEN 4 THEN SUM(count(t2.ReviewType)) END) AS Apr,
     (CASE MONTH(dateCompleted) WHEN 5 THEN SUM(count(t2.ReviewType)) END) AS May,
     (CASE MONTH(dateCompleted) WHEN 6 THEN SUM(count(t2.ReviewType)) END) AS Jun,
     (CASE MONTH(dateCompleted) WHEN 7 THEN SUM(count(t2.ReviewType)) END) AS Jul,
     (CASE MONTH(dateCompleted) WHEN 8 THEN SUM(count(t2.ReviewType)) END) AS Aug,
     (CASE MONTH(dateCompleted) WHEN 9 THEN SUM(count(t2.ReviewType)) END) AS Sep,
     (CASE MONTH(dateCompleted) WHEN 10 THEN SUM(count(t2.ReviewType)) END) AS Oct,
     (CASE MONTH(dateCompleted) WHEN 11 THEN SUM(count(t2.ReviewType)) END) AS Nov,
     (CASE MONTH(dateCompleted) WHEN 12 THEN SUM(count(t2.ReviewType)) END) AS Dec,

FROM SQL1.dbo.qryPeakReviews t1
INNER JOIN SQL1.dbo.qryPeakReviews t2 ON t1.ReviewType >= t2.ReviewType
GROUP BY t1.ReviewType, count(t1.ReviewType)
ORDER BY MONTH(dateCompleted)


实际想法是:

SELECT t1.id, t1.num, SUM(t2.num) as c_sum
FROM @t t1
INNER JOIN @t t2 on t1.id >= t2.id
GROUP BY t1.id, t1.num
ORDER BY t1.id

输出

| id | num      |c_sum|
-----------------------
|  1 |        5 |  5 |
|  2 |        7 |  12 |
|  3 |        3 |  15 |
|  4 |       15 |  30 |
|  5 |       20 |  50 |
© www.soinside.com 2019 - 2024. All rights reserved.