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