相关疑难解决方法(0)

如何获得累计金额

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)

sql-server sql-server-2008

165
推荐指数
7
解决办法
29万
查看次数

分区函数COUNT()可以使用DISTINCT

我正在尝试编写以下内容,以便获得不同的NumUsers,如下所示:

NumUsers = COUNT(DISTINCT [UserAccountKey]) OVER (PARTITION BY [Mth])
Run Code Online (Sandbox Code Playgroud)

管理工作室对此并不感到高兴.当我删除DISTINCT关键字时,错误消失,但它不会是一个独特的计数.

DISTINCT在分区函数中似乎不可能.我如何寻找独特的计数?我是否使用更传统的方法,例如相关子查询?

进一步研究一下,也许这些OVER函数与Oracle的工作方式不同,它们不能用于SQL-Server计算运行总计.

我在SQLfiddle上添加了一个实例,我尝试使用分区函数来计算运行总计.

sql t-sql sql-server sql-server-2008-r2 sql-server-2014

69
推荐指数
4
解决办法
12万
查看次数

为什么窗口聚合函数的逻辑读取如此之高?

我发现在使用公共子表达式假脱机的执行计划中,报告的逻辑读取对于大型表来说非常高.

经过一些试验和错误后,我发现了一个似乎适用于下面的测试脚本和执行计划的公式. 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)

sql sql-server sql-server-2008

22
推荐指数
1
解决办法
2584
查看次数

SQL:在OVER()中使用WHERE子句?

如何WHEREOVER子句中使用子句进行过滤?

即来自以下数据

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 sql-server-2008

13
推荐指数
1
解决办法
2万
查看次数

nvarchar concatenation/index/nvarchar(max)莫名其妙的行为

我今天在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)

sql-server nvarchar string-concatenation sql-server-2012

12
推荐指数
1
解决办法
4765
查看次数

使用OVER()的"语法不正确"错误

我有一个月的每个交易日的销售预算.因此,对于第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)

sql t-sql sql-server

9
推荐指数
1
解决办法
5629
查看次数

子查询或leftjoin与哪个更快的组?

查询执行计划我必须在我的应用程序中显示总计列的运行总数...所以我使用以下查询来查找运行总计..​​.我发现两者都按照我的需要工作.在一个我使用左连接与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)

sql-server-2005 subquery running-total left-join

7
推荐指数
1
解决办法
2614
查看次数

SQL累积计数

我有部门的表.我需要计算在哪个部门内有多少人.这很容易做到

SELECT DEPT,
       COUNT(*) as 'Total'
    FROM SR
    GROUP BY DEPT;
Run Code Online (Sandbox Code Playgroud)

现在我还要做累积计数如下:

在此输入图像描述

我发现一些SQL来计算运行总数,但不是这样的情况.在这种情况下,你能给我一些建议吗?

sql sql-server sql-server-2008

7
推荐指数
1
解决办法
1万
查看次数

SUM列SQL SERVER

我有一张表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)

有帮助吗?

sum sql-server-2008

6
推荐指数
1
解决办法
233
查看次数

按年份和月份选择总计数()组?

例如,想象一下如下表

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)

那么如何通过简单的查询获得第一个结果呢?不是循环

sql sql-server group-by sql-server-2005 count

5
推荐指数
1
解决办法
3337
查看次数