declare @t table
(
id int,
SomeNumt int
)
insert into @t
select 1,10
union
select 2,12
union
select 3,3
union
select 4,15
union
select 5,23
select * from @t
Run Code Online (Sandbox Code Playgroud)
上面的选择返回以下内容.
id SomeNumt
1 10
2 12
3 3
4 15
5 23
Run Code Online (Sandbox Code Playgroud)
我如何得到以下内容
id srome CumSrome
1 10 10
2 12 22
3 3 25
4 15 40
5 23 63
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写以下内容,以便获得不同的NumUsers,如下所示:
NumUsers = COUNT(DISTINCT [UserAccountKey]) OVER (PARTITION BY [Mth])
Run Code Online (Sandbox Code Playgroud)
管理工作室对此并不感到高兴.当我删除DISTINCT关键字时,错误消失,但它不会是一个独特的计数.
DISTINCT在分区函数中似乎不可能.我如何寻找独特的计数?我是否使用更传统的方法,例如相关子查询?
进一步研究一下,也许这些OVER函数与Oracle的工作方式不同,它们不能用于SQL-Server计算运行总计.
我在SQLfiddle上添加了一个实例,我尝试使用分区函数来计算运行总计.
我发现在使用公共子表达式假脱机的执行计划中,报告的逻辑读取对于大型表来说非常高.
经过一些试验和错误后,我发现了一个似乎适用于下面的测试脚本和执行计划的公式. Worktable logical reads = 1 + NumberOfRows * 2 + NumberOfGroups * 4
我不明白为什么这个公式成立的原因.这比我想象的更有必要看一下这个计划.任何人都可以通过吹嘘这个帐户的内容来打击这个吗?
或者失败那是否有任何方法来跟踪每个逻辑读取中读取的页面,以便我可以自己解决?
SET STATISTICS IO OFF; SET NOCOUNT ON;
IF Object_id('tempdb..#Orders') IS NOT NULL
DROP TABLE #Orders;
CREATE TABLE #Orders
(
OrderID INT IDENTITY(1, 1) NOT NULL PRIMARY KEY CLUSTERED,
CustomerID NCHAR(5) NULL,
Freight MONEY NULL,
);
CREATE NONCLUSTERED INDEX ix
ON #Orders (CustomerID)
INCLUDE (Freight);
INSERT INTO #Orders
VALUES (N'ALFKI', 29.46),
(N'ALFKI', 61.02),
(N'ALFKI', 23.94),
(N'ANATR', 39.92),
(N'ANTON', 22.00);
SELECT PredictedWorktableLogicalReads =
1 + …Run Code Online (Sandbox Code Playgroud) 如何WHERE在OVER子句中使用子句进行过滤?
即来自以下数据
LoanID | Principal | Tenor | AmortizingPrincipal
----------------------------------------
1 20000 1 5000
1 20000 2 5000
1 20000 3 5000
1 20000 4 5000
Run Code Online (Sandbox Code Playgroud)
我需要在每个Tenor中使用Balance Principal的第四个虚拟列,如下所示:
LoanID | Principal | Tenor | AmortizingPrincipal | BalancePrinicpal
-----------------------------------------------------------
1 20000 1 5000 20000
1 20000 2 5000 15000
1 20000 3 5000 10000
1 20000 4 5000 5000
Run Code Online (Sandbox Code Playgroud)
像这样的东西:
SELECT
BalancePrincipal = Principal - SUM(AmortizingPrincipal) OVER(PARTITION BY LoanID WHERE Tenor < this row's tenor)
Run Code Online (Sandbox Code Playgroud)
更新:
以下查询为我提供了所需的结果: …
我今天在SQL Server(2008R2和2012)中遇到了一个非常奇怪的问题.我正在尝试使用串联和select语句来构建字符串.
我找到了解决方法,但我真的很想了解这里发生了什么以及为什么它没有给我预期的结果.有人可以向我解释一下吗?
http://sqlfiddle.com/#!6/7438a/1
根据要求,这里的代码也是:
-- base table
create table bla (
[id] int identity(1,1) primary key,
[priority] int,
[msg] nvarchar(max),
[autofix] bit
)
-- table without primary key on id column
create table bla2 (
[id] int identity(1,1),
[priority] int,
[msg] nvarchar(max),
[autofix] bit
)
-- table with nvarchar(1000) instead of max
create table bla3 (
[id] int identity(1,1) primary key,
[priority] int,
[msg] nvarchar(1000),
[autofix] bit
)
-- fill the three tables with the same values …Run Code Online (Sandbox Code Playgroud) 我有一个月的每个交易日的销售预算.因此,对于第1天,预算为300,第2天预算为400,然后月初至今的预算为700.我在查询中收到此错误: Incorrect syntax near 'ROWS'.
select
TradingDate
,Budget
,sum(Budget) over (PARTITION BY TradingDate
order by TradingDate asc
ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING),1) AS BudgetMTD
from #4
Run Code Online (Sandbox Code Playgroud)
我必须在我的应用程序中显示总计列的运行总数...所以我使用以下查询来查找运行总计...我发现两者都按照我的需要工作.在一个我使用左连接与group by和另一个我使用子查询.
现在我的问题是,当我的数据每天增加数千时,哪一个更快,如果数据将限制在1000或2000行,那么哪一个更好......而且任何其他方法比这两个更快? ??
declare @tmp table(ind int identity(1,1),col1 int)
insert into @tmp
select 2
union
select 4
union
select 7
union
select 5
union
select 8
union
select 10
SELECT t1.col1,sum( t2.col1)
FROM @tmp AS t1 LEFT JOIN @tmp t2 ON t1.ind>=t2.ind
group by t1.ind,t1.col1
select t1.col1,(select sum(col1) from @tmp as t2 where t2.ind<=t1.ind)
from @tmp as t1
Run Code Online (Sandbox Code Playgroud) 我有部门的表.我需要计算在哪个部门内有多少人.这很容易做到
SELECT DEPT,
COUNT(*) as 'Total'
FROM SR
GROUP BY DEPT;
Run Code Online (Sandbox Code Playgroud)
现在我还要做累积计数如下:

我发现一些SQL来计算运行总数,但不是这样的情况.在这种情况下,你能给我一些建议吗?
我有一张表SQL Server,我需要总结一列,如下例所示:
CREATE TABLE B
(
ID int,
Qty int,
)
INSERT INTO B VALUES (1,2)
INSERT INTO B VALUES (2,7)
INSERT INTO B VALUES (3,2)
INSERT INTO B VALUES (4,11)
SELECT *, '' AS TotalQty FROM B
ORDER BY ID
Run Code Online (Sandbox Code Playgroud)
在这个例子中我需要的是列TotalQty给我的值如下:
2
9
11
22
Run Code Online (Sandbox Code Playgroud)
有帮助吗?
例如,想象一下如下表
select accountid, createdon from account
73C56F61-5FF1-E111-A4F8-005056977FBC 2012-08-28 22:26:47.000
A7C56F61-5FF1-E111-A4F8-005056977FBC 2012-08-28 22:26:48.000
B7C56F61-5FF1-E111-A4F8-005056977FBC 2012-08-28 22:26:48.000
FBC56F61-5FF1-E111-A4F8-005056977FBC 2012-08-28 22:26:49.000
CBC66F61-5FF1-E111-A4F8-005056977FBC 2012-08-28 22:26:54.000
87C66F61-5FF1-E111-A4F8-005056977FBC 2012-08-28 22:26:53.000
53C76F61-5FF1-E111-A4F8-005056977FBC 2012-08-28 22:26:55.000
87C76F61-5FF1-E111-A4F8-005056977FBC 2012-08-28 22:26:56.000
2ED89924-5CFC-E111-A4F8-005056977FBC 2012-09-11 22:01:51.000
C0D79924-5CFC-E111-A4F8-005056977FBC 2012-09-11 22:01:49.000
Run Code Online (Sandbox Code Playgroud)
然后在2012年1月,该计数是10个帐户
select count(*) from account
Run Code Online (Sandbox Code Playgroud)
假设我在2012年2月有5个新帐户,然后count(*)在2012年2月查询返回15个帐户.如果我在2012年3月有10个新帐户,那么count(*)在2012年3月查询总共会返回35个帐户.
我想得到以下结果
2012-january-10 accounts
2012-febrary-15 accounts
2012-march- 35 accounts
Run Code Online (Sandbox Code Playgroud)
表帐户中的创建日期是日期,
但是如果我这样做的话
select year(createdon), month(createdon), count(*) quantity
from accounts
group by year(createdon), month(createdon)
Run Code Online (Sandbox Code Playgroud)
我得到以下结果:
2012-january-10 accounts
2012-febrary-5 accounts
2012-march- 20 accounts
Run Code Online (Sandbox Code Playgroud)
那么如何通过简单的查询获得第一个结果呢?不是循环