Sql server 2008 是否向TSQL查询(SQL Server 2008)添加累积(运行)总计?

Sql server 2008 是否向TSQL查询(SQL Server 2008)添加累积(运行)总计?,sql-server-2008,tsql,aggregation,Sql Server 2008,Tsql,Aggregation,我有以下查询,显示特定日期范围内的每周总计: declare @from_date datetime declare @to_date datetime SET @from_date = '2014-03-30'; SET @to_date = '2014-08-10'; SELECT DATEDIFF(week, 0, IDOC.Import_Date) Week, DATEADD(week, DATEDIFF(week, 0, IDOC.Import_Date),

我有以下查询,显示特定日期范围内的每周总计:

declare @from_date datetime
declare @to_date datetime

SET @from_date = '2014-03-30';    
SET @to_date = '2014-08-10';    

SELECT DATEDIFF(week, 0, IDOC.Import_Date) Week,
    DATEADD(week, DATEDIFF(week, 0, IDOC.Import_Date), 0) 'From Date',
    DATEADD(week, DATEDIFF(week, 0, IDOC.Import_Date), 0) + 6 'End Date',
    COUNT(IDOC.IDOC_ID) 'Total'
FROM IDOC    
INNER JOIN dbo.File_Type FI     
        on IDOC.File_Type_ID = FI.File_Type_ID    
INNER JOIN  IDOC_Team_Assignment ITA    
    ON IDOC.IDOC_ID=ITA.IDOC_ID    
Where IDOC.Import_Date BETWEEN @from_date AND @to_date
GROUP BY DATEDIFF(week, 0, IDOC.Import_Date) 
ORDER BY DATEDIFF(week, 0, IDOC.Import_Date)
输出:

Week    | From Date      | End Date      | Total
--------------------------------------------------
5965    2014-04-28    2014-05-04        1
5967    2014-05-12    2014-05-18      1
5968    2014-05-19    2014-05-25      2
我想添加累计总跑步总跑步总跑步总跑步总跑步总跑步总跑步总跑步总跑步总跑步总跑步总跑步总跑步总跑步总跑步总跑步总跑步总跑步总跑步总跑步总跑步总跑步总跑步总跑步总跑步总跑步总跑步总跑步总跑步总跑步总


xQbert提供给您的链接向您展示了这个概念,但是当您的select中已经有另一个计数时,它可能会有点混乱

您需要删除您的分组,并在两个计数上使用over,将一个限制为仅在您已经拥有的分组上计数,第二个覆盖整个范围

在这种情况下,不能使用前面未绑定的行,因为它将为每一行创建一个条目,而不是在现有结果集上构建。但您确实需要在结束时和选择结束时保持订单同步

您还需要添加不同的关键字

SELECT DISTINCT
    DATEDIFF(week, 0, IDOC.Import_Date) Week,
    DATEADD(week, DATEDIFF(week, 0, IDOC.Import_Date), 0) 'From Date',
    DATEADD(week, DATEDIFF(week, 0, IDOC.Import_Date), 0) + 6 'End Date',
    COUNT(IDOC.IDOC_ID) OVER (PARTITION BY DATEDIFF(week, 0, IDOC.Import_Date)) 'Total',
    COUNT(IDOC.IDOC_ID) OVER (ORDER BY DATEDIFF(week, 0, IDOC.Import_Date)) 'Running Total'
FROM IDOC    
INNER JOIN dbo.File_Type FI     
        on IDOC.File_Type_ID = FI.File_Type_ID    
INNER JOIN  IDOC_Team_Assignment ITA    
    ON IDOC.IDOC_ID=ITA.IDOC_ID    
WHERE IDOC.Import_Date BETWEEN @from_date AND @to_date
ORDER BY DATEDIFF(week, 0, IDOC.Import_Date)
我不能在SQL Server 2008上测试它,但我确实在VS2013免费提供的任何软件中测试了它,我知道它在Oracle中也能工作。值得一试

这一个是在SQL Server 2008 R2上测试的-我希望您不要急于获取此数据

SELECT
    DATEDIFF(week, 0, IDOC.Import_Date) Week,
    DATEADD(week, DATEDIFF(week, 0, IDOC.Import_Date), 0) 'From Date',
    DATEADD(week, DATEDIFF(week, 0, IDOC.Import_Date), 0) + 6 'End Date',
    COUNT(IDOC.IDOC_ID) 'Total',
    (
        SELECT
            COUNT(aIDOC.IDOC_ID)
        FROM
            IDOC aIDOC
        INNER JOIN dbo.File_Type aFI     
            ON aIDOC.File_Type_ID = aFI.File_Type_ID    
        INNER JOIN IDOC_Team_Assignment aITA    
            ON aIDOC.IDOC_ID=aITA.IDOC_ID    
        WHERE
            aIDOC.Import_Date BETWEEN @from_date AND @to_date
            AND DATEDIFF(week, 0, IDOC.Import_Date) <= DATEDIFF(week, 0, aIDOC.Import_Date)
    ) 'RunningTotal'
FROM
    IDOC
INNER JOIN dbo.File_Type FI     
    ON IDOC.File_Type_ID = FI.File_Type_ID    
INNER JOIN  IDOC_Team_Assignment ITA    
    ON IDOC.IDOC_ID=ITA.IDOC_ID    
WHERE
    IDOC.Import_Date BETWEEN @from_date AND @to_date
GROUP BY
    DATEDIFF(week, 0, IDOC.Import_Date) 
ORDER BY
    DATEDIFF(week, 0, IDOC.Import_Date)
现在我把它改成了CTE,在我看来更干净

WITH CTE( WeekNbr, FromDate, EndDate, Total) AS (
    SELECT
        DATEDIFF(week, 0, IDOC.Import_Date) 'WeekNbr',
        DATEADD(week, DATEDIFF(week, 0, IDOC.Import_Date), 0) 'FromDate',
        DATEADD(week, DATEDIFF(week, 0, IDOC.Import_Date), 0) + 6 'EndDate',
        COUNT(IDOC.IDOC_ID) 'Total'
    FROM
        IDOC
    INNER JOIN dbo.File_Type FI     
        ON IDOC.File_Type_ID = FI.File_Type_ID    
    INNER JOIN  IDOC_Team_Assignment ITA    
        ON IDOC.IDOC_ID=ITA.IDOC_ID    
    WHERE
        IDOC.Import_Date BETWEEN @from_date AND @to_date
    GROUP BY
        DATEDIFF(week, 0, IDOC.Import_Date) 
)
SELECT
    A.WeekNbr,
    A.FromDate,
    A.EndDate,
    A.Total,
    (SELECT SUM(B.Total) FROM CTE B WHERE B.WeekNbr <= A.WeekNbr) 'RunningTotal'
FROM
    CTE A
ORDER BY
    A.WeekNbr

你想要的是一个连续的总数,而不是一个累积的总数。该链接向您展示了如何做到这一点;在SQL Server 2008中,如果没有临时表,这看起来不是很简单吗?谢谢你给我这个很好的例子。我需要弄清楚为什么它的编码是:COUNTIDOC.IDOC\u ID OVER ORDER BY DATEDIFFweek,0,IDOC.Import\u Date“Running Total”在“ORDER”附近的语法不正确。这可能是因为SQL Server 2008无法做到这一点,但微软说是这样。我查看了文档:2008年不可能使用ORDER BY with OVER,我的意思是
WITH CTE( WeekNbr, FromDate, EndDate, Total) AS (
    SELECT
        DATEDIFF(week, 0, IDOC.Import_Date) 'WeekNbr',
        DATEADD(week, DATEDIFF(week, 0, IDOC.Import_Date), 0) 'FromDate',
        DATEADD(week, DATEDIFF(week, 0, IDOC.Import_Date), 0) + 6 'EndDate',
        COUNT(IDOC.IDOC_ID) 'Total'
    FROM
        IDOC
    INNER JOIN dbo.File_Type FI     
        ON IDOC.File_Type_ID = FI.File_Type_ID    
    INNER JOIN  IDOC_Team_Assignment ITA    
        ON IDOC.IDOC_ID=ITA.IDOC_ID    
    WHERE
        IDOC.Import_Date BETWEEN @from_date AND @to_date
    GROUP BY
        DATEDIFF(week, 0, IDOC.Import_Date) 
)
SELECT
    A.WeekNbr,
    A.FromDate,
    A.EndDate,
    A.Total,
    (SELECT SUM(B.Total) FROM CTE B WHERE B.WeekNbr <= A.WeekNbr) 'RunningTotal'
FROM
    CTE A
ORDER BY
    A.WeekNbr