Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 计算跑步总量的最佳方法是什么?_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql 计算跑步总量的最佳方法是什么?

Sql 计算跑步总量的最佳方法是什么?,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,这是我在3月份运行的SQL查询,它运行得非常完美,但当我在4月份运行它时,它就一直在运行 然而,如果我避免运行total,它会再次运行良好 如果语法错误或设计有替代方案,请提供帮助 ; WITH T as ( SELECT 0 as seq,0 as [Ref No],'' as [Type],0 as [JV NO] ,0 as[MONTH],DATEADD(day,DATEDIFF(day,0,'20140401')-1,0) as [Date],0 as [Chequ No.],DATEA

这是我在3月份运行的SQL查询,它运行得非常完美,但当我在4月份运行它时,它就一直在运行

然而,如果我避免运行total,它会再次运行良好

如果语法错误或设计有替代方案,请提供帮助

;
WITH T as (
SELECT 0 as seq,0 as [Ref No],'' as [Type],0 as [JV NO] ,0 as[MONTH],DATEADD(day,DATEDIFF(day,0,'20140401')-1,0) as [Date],0 as [Chequ No.],DATEADD(day,DATEDIFF(day,0, '20140401')-1,0) as [Due Date],'Transferred' as [Discription],'' as[Payee],
0 as [Debit],  -- ANA DÖVÝZ BORÇ
0 as [Credit],  -- ANA DÖVÝZ ALACAK
SUM([#msg_S_0103\T]) as [Amount] -- ANA DÖVÝZ TUTAR
,dbo.fn_CariHarEvrTipUzun(cha_evrak_tip) AS [msg_S_0094] 
,cha_RECno
,cha_RECid_RECno
From dbo.fn_HamCariFoy ( N'0',2, N'01',1,null,DATEADD(day,DATEDIFF(day,0,'20140401')-1,0),0,'','' )
inner join CARI_HESAP_HAREKETLERI on CARI_HESAP_HAREKETLERI.cha_RECno = [msg_S_0088]
GROUP BY [#msg_S_1712],[msg_S_0112],cha_evrak_tip ,cha_RECno
,cha_RECid_RECno
union all
Select TOP 100 Percent ROW_NUMBER ()  over (order by cha_tarihi ) as seq,msg_S_0091 as [Ref No],

 msg_S_0003 as [Type],[JV NO],[MONTH],msg_S_0089 as [Date],
 case  ISNUMERIC(#msg_S_0093) when 1 then
 CONVERT(int, ISNULL(NULLIF (#msg_S_0093, ''), 0))
else 0
end as [Chequ No.],
msg_S_0098 as [Due Date],#msg_S_0085 as [Discription],[Payee],
sum([msg_S_0101\T]) as 'Debit',sum([msg_S_0102\T]) as 'Credit',
(sum([msg_S_0101\T])- sum([msg_S_0102\T]))AS 'Amount'
,dbo.fn_CariHarEvrTipUzun(cha_evrak_tip) AS [msg_S_0094] 
,cha_RECno
,cha_RECid_RECno
from dbo.fn_CariFoy (N'0',2,N'01',1,DATEADD(day,DATEDIFF(day,0, '20140401')-1,0), '20140401',     '20140430',0,N'')
inner join CARI_HESAP_HAREKETLERI on CARI_HESAP_HAREKETLERI.cha_RECno = [msg_S_0088] 
group by msg_S_0091,msg_S_0003,msg_S_0089,#msg_S_0093,#msg_S_0085,[MONTH],msg_S_0098          ,cha_RECno,cha_tarihi
,cha_RECid_RECno
,[JV NO],[Payee] ,cha_evrak_tip
order by convert(int,#msg_S_0093)
)

**SELECT * ,(SELECT SUM(Amount)  from T as b
 Where b.seq <= a.seq )as [Remaining Balance] from T a
order by Date** 
计算跑步总量的最佳方法是什么?如何优化上述查询?

我正在按照Tanveer Khan的建议编写游标

只需将CTE的结果插入一个临时表,即可避免计算运行总计

;WITH T AS
(
   -- Your queries 
)
SELECT * INTO #TEMP
FROM T
现在,您需要从上面的临时表中选择结果,以使用游标查找运行总数

现在,运行总数将保存在临时表的一列中,您可以使用

SELECT * FROM #TEMP
请随时询问任何疑问。
最好的祝愿。

你知道问题是什么!您的查询进入循环,请提供一些数据。当您删除SELECT并仅保留时,它如何能够完美运行?SQL Server引擎将报告语法错误。实际上,您正在计算每条记录的运行总数。对于第二条记录->第一条记录+第二条记录,对于第三条记录->第一条记录+第二条记录+第三条记录…等等,它肯定会变慢。需要注意的是,即使游标有性能问题,游标计算running total的速度也比上面提到的要快@Tanveer KhanCan您是否共享实际的查询计划?使用此链接解释运行total的最佳方式这对您有帮助吗@坦韦尔汗
SELECT * FROM #TEMP