Sql 计算跑步总量的最佳方法是什么?
这是我在3月份运行的SQL查询,它运行得非常完美,但当我在4月份运行它时,它就一直在运行 然而,如果我避免运行total,它会再次运行良好 如果语法错误或设计有替代方案,请提供帮助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
;
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