我有这个表DDL:
CREATE TABLE [dbo].[Audit] (
[AuditId] INT IDENTITY (1, 1) NOT NULL,
[Entity] INT NOT NULL,
[Action] INT NOT NULL,
[Id] UNIQUEIDENTIFIER NULL,
CONSTRAINT [PK_Audit] PRIMARY KEY CLUSTERED ([AuditId] ASC)
);
更新 - 我在这里添加了缺少的SQL。抱歉,
我所做的是使用这个SQL创建一个SQL报告,它会告诉我每天有多少活动:
select [col1] = CONVERT(VARCHAR(10), DATEADD(HOUR, 8, a.date), 101) ,
[Col2] = convert(varchar, count(*))
from Audit a
group by CONVERT(VARCHAR(10), DATEADD(HOUR, 8, a.date), 101)
order by CONVERT(VARCHAR(10), DATEADD(HOUR, 8, a.date), 101) desc
输出如下:
col1 Col2
03/05/2017 1
03/04/2017 20
03/03/2017 10
03/02/2017 5
03/01/2017 10
我现在需要做的是创建一个SQL选择,它显示累积值而不是计数。所以我需要SQL来创建一个显示这个
的报告col1 Col2
03/05/2017 46
03/04/2017 45
03/03/2017 25
03/02/2017 15
03/01/2017 10
有没有人知道如何修改我的SQL以创建这种类型的报告?
请注意,我正在寻找一个命令解决方案,因为它是从.net框架执行的,如果解决方案中有多个命令,我想我需要弄清楚如何以某种方式将它放入存储过程。
答案 0 :(得分:5)
您可以使用窗口函数Sum() Over
Select col1 = convert(varchar(10),cast(dateadd(HOUR, 8, a.date) as date),101)
,col2 = sum(count(*)) over (Order by cast(dateadd(HOUR, 8, a.date) as date))
From Audit a
Group by cast(dateadd(HOUR, 8, a.date) as date)
Order By cast(dateadd(HOUR, 8, a.date) as date) Desc
返回
col1 Col2
03/05/2017 46
03/04/2017 45
03/03/2017 25
03/02/2017 15
03/01/2017 10
答案 1 :(得分:4)
使用“with”语句将总和包含在一个命令中。像这样:
WITH TBL ([col1], [col2])
AS
(
SELECT [col1] = CONVERT(DATE, DATEADD(HOUR, 8, a.date)),
[Col2] = COUNT(*)
FROM Audit a
GROUP BY CONVERT(DATE, DATEADD(HOUR, 8, a.date))
)
SELECT [col1] = CONVERT(VARCHAR(10), t1.[col1], 101),
[col2] = CONVERT(VARCHAR, SUM(t2.[Col2]))
FROM TBL t1 INNER JOIN TBL t2 on t1.col1 >= t2.col1
GROUP BY t1.col1
ORDER BY t1.col1 DESC
祝你好运!
答案 2 :(得分:2)
如果您提供审核表的数据样本而不是结果集的数据,那么您可能会获得优化和准确的查询。
使用Sql 2012,
DECLARE @Audit TABLE (
[col1] datetime NOT NULL
,[col2] INT NOT NULL
)
insert into @audit(col1,Col2)
VALUES
('03/05/2017', 1 )
,('03/04/2017', 20 )
,('03/03/2017', 10 )
,('03/02/2017', 5 )
,('03/01/2017', 10 )
;WITH CTE as
(
select col1 ,sum(col2) over(ORDER BY col1 desc RANGE BETWEEN
CURRENT ROW AND UNBOUNDED FOLLOWING) AS col2
from @Audit
)
SELECT * FROM cte
order by col1 desc
答案 3 :(得分:1)
您可以尝试以下内容。
IF OBJECT_ID('tempdb..#CumulativeSum') IS NOT NULL
DROP TABLE #CumulativeSum
SELECT t1.col1, t1.col2 AS col2Actual, SUM(t2.col2) AS col2
INTO #CumulativeSum
FROM Audit t1
INNER JOIN Audit t2 on t1.col1 >= t2.col1
GROUP BY t1.col1, t1.col2
ORDER BY t1.col1
SELECT col1, col2 FROM #CumulativeSum ORDER BY col2 DESC
答案是从FiReTiTi建议的下方链接中复制的。
编辑 - 用于查询单个命令。
SELECT col1, col2 FROM(
SELECT TOP 100 PERCENT t1.col1, t1.col2 AS col2Actual, SUM(t2.col2) AS col2
FROM Audit t1
INNER JOIN Audit t2 on t1.col1 >= t2.col1
GROUP BY t1.col1, t1.col2
ORDER BY t1.col1)x
ORDER BY col2 DESC
希望这有助于达到您的确切要求。
答案 4 :(得分:1)
尝试以下查询
select [col1] = CONVERT(VARCHAR(10), DATEADD(HOUR, 8, a.date), 101) ,
[Col2] = (select count(*) from Audit b where b.date<= DATEADD(HOUR, 8, a.date))
from Audit a
group by DATEADD(HOUR, 8, a.date)
order by CONVERT(VARCHAR(10), DATEADD(HOUR, 8, a.date), 101) desc
答案 5 :(得分:1)
仅通过以下查询更改您的查询(此查询仅在您使用SQL SERVER 2012时有效)
试试这个:
std::shared_ptr<TaskLoop> t = std::make_shared<>(FunctorClass(o));