繁体   English   中英

如何计算 SQL Server 2008 中的运行总计(月至今)

[英]How to calculate running total (month to date) in SQL Server 2008

我正在尝试使用 SQL Server 2008 计算本月至今的总数。

我正在尝试在活动和代表级别生成一个月至今的计数。 以下是我想要生成的结果:

| REPRESENTATIVE_ID | MONTH | WEEK | TOTAL_WEEK_ACTIVITY_COUNT | MONTH_TO_DATE_ACTIVITIES_COUNT |
|-------------------|-------|------|---------------------------|--------------------------------|
|                40 |     7 | 7/08 |                         1 |                              1 |
|                40 |     8 | 8/09 |                         1 |                              1 |
|                40 |     8 | 8/10 |                         1 |                              2 |
|                41 |     7 | 7/08 |                         2 |                              2 |
|                41 |     8 | 8/08 |                         4 |                              4 |
|                41 |     8 | 8/09 |                         3 |                              7 |
|                41 |     8 | 8/10 |                         1 |                              8 |

从下表中:

ACTIVITIES_FACT 表

+-------------------+------+-----------+  
| Representative_ID | Date | Activity  |  
+-------------------+------+-----------+  
|                41 | 8/03 | Call      |  
|                41 | 8/04 | Call      |  
|                41 | 8/05 | Call      |  
+-------------------+------+-----------+  

LU_TIME 表

+-------+-----------------+--------+  
| Month | Date            | Week   |  
+-------+-----------------+--------+  
|     8 | 8/01            | 8/08   |  
|     8 | 8/02            | 8/08   |  
|     8 | 8/03            | 8/08   |  
|     8 | 8/04            | 8/08   |  
|     8 | 8/05            | 8/08   |  
+-------+-----------------+--------+ 

我不确定如何执行此操作:我一直遇到子查询中不允许进行多次计数或聚合的问题。

运行总计是每次将新数字添加到序列时更新的数字序列的总和,只需将新数字的值添加到运行总计即可。

认为他希望按每个代表_Id计算 Month 的运行总数,因此group by周进行简单的group by是不够的。 他可能希望在每周结束时更新他的Month_To_Date_Activities_Count

此查询提供按代表_Id、周排序的运行总数(从月份到周末日期)

SELECT a.Representative_ID, l.month, l.Week, Count(*) AS Total_Week_Activity_Count
    ,(SELECT  count(*)
        FROM ACTIVITIES_FACT a2
        INNER JOIN LU_TIME l2 ON a2.Date = l2.Date
        AND a.Representative_ID = a2.Representative_ID
        WHERE l2.week <=  l.week
        AND l2.month = l.month) Month_To_Date_Activities_Count
FROM ACTIVITIES_FACT a
INNER JOIN LU_TIME l ON a.Date = l.Date
GROUP BY a.Representative_ID, l.Week, l.month
ORDER BY a.Representative_ID, l.Week

| REPRESENTATIVE_ID | MONTH | WEEK | TOTAL_WEEK_ACTIVITY_COUNT | MONTH_TO_DATE_ACTIVITIES_COUNT |
|-------------------|-------|------|---------------------------|--------------------------------|
|                40 |     7 | 7/08 |                         1 |                              1 |
|                40 |     8 | 8/09 |                         1 |                              1 |
|                40 |     8 | 8/10 |                         1 |                              2 |
|                41 |     7 | 7/08 |                         2 |                              2 |
|                41 |     8 | 8/08 |                         4 |                              4 |
|                41 |     8 | 8/09 |                         3 |                              7 |
|                41 |     8 | 8/10 |                         1 |                              8 |

SQL 小提琴示例

据我了解你的问题:

SELECT af.Representative_ID
, lt.Week
, COUNT(af.Activity) AS Qnt
FROM ACTIVITIES_FACT af
INNER JOIN LU_TIME lt ON lt.Date = af.date
GROUP BY af.Representative_ID, lt.Week

SqlFiddle

Representative_ID   Week                           Month_To_Date_Activities_Count
 41                 2013-08-01 00:00:00.000        1
 41                 2013-08-08 00:00:00.000        3
 USE tempdb;
GO
IF OBJECT_ID('#ACTIVITIES_FACT','U') IS NOT NULL DROP TABLE #ACTIVITIES_FACT;
CREATE TABLE #ACTIVITIES_FACT
(
 Representative_ID INT NOT NULL
,Date DATETIME NULL
, Activity VARCHAR(500) NULL
)

IF OBJECT_ID('#LU_TIME','U') IS NOT NULL DROP TABLE #LU_TIME;
CREATE TABLE #LU_TIME
(
 Month INT
,Date DATETIME
,Week DATETIME
)

INSERT INTO #ACTIVITIES_FACT(Representative_ID,Date,Activity)
VALUES
 (41,'7/31/2013','Chat')
,(41,'8/03/2013','Call')
,(41,'8/04/2013','Call')
,(41,'8/05/2013','Call')

INSERT INTO #LU_TIME(Month,Date,Week)
VALUES
 (8,'7/31/2013','8/01/2013')
,(8,'8/01/2013','8/08/2013')
,(8,'8/02/2013','8/08/2013')
,(8,'8/03/2013','8/08/2013')
,(8,'8/04/2013','8/08/2013')
,(8,'8/05/2013','8/08/2013')
--Begin Query
SELECT      AF.Representative_ID
            ,LU.Week
            ,COUNT(*) AS Month_To_Date_Activities_Count
FROM        #ACTIVITIES_FACT AS AF
INNER JOIN  #LU_TIME AS LU
    ON      AF.Date = LU.Date
Group By    AF.Representative_ID
            ,LU.Week

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM