当前位置: 代码迷 >> Sql Server >> 请客位友人帮忙看看SQL这样的查询结果
  详细解决方案

请客位友人帮忙看看SQL这样的查询结果

热度:49   发布时间:2016-04-24 09:51:35.0
请客位朋友帮忙看看SQL这样的查询结果?
我有一个表T1,结构与数量如下:
日期                 入库数量      出库数量    
2014-01-02       500                  0           
2014-01-02                              300           
2014-01-02       500                  0           
2014-01-02                               500           
2014-01-02       800                  0           
2014-01-02       250                  245        


我想要的结果是增加多一列库存余额,该列计算公式:上一行余额+当前行入库-当前行出库
效果如下:
日期                 入库数量      出库数量     库存余额  
2014-01-02       500                  0             500
2014-01-02                              300          200 
2014-01-02       500                  0            700
2014-01-02                               500        200     
2014-01-02       800                  0           1000
2014-01-02       250                  245      1005



------解决思路----------------------
;WITH T1CTE AS(
SELECT ROW_NUMBER()OVER(ORDER BY GETDATE())RN,*FROM T1
)
,CTE AS(
SELECT RN,[日期],[入库数量],[出库数量],[入库数量]-[出库数量] [库存余额] FROM T1CTE WHERE RN=1
UNION ALL
SELECT A.RN,A.[日期],A.[入库数量],A.[出库数量],A.[入库数量]-A.[出库数量]+B.[库存余额] FROM T1CTE A JOIN CTE B ON A.RN=B.RN+1
)
SELECT * FROM CTE
上面搞错了一个字段~~已修改
------解决思路----------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:


不知道入庫數量怎麼有為空?不是為0嗎?
假設入庫數量的字段類型是數字

with cte as 
(
select *,row_number() over(order by getdate() asc) as rId from T1
)
select a.[日期],a.[入库数量],a.[出库数量],(select sum(入库数量) from cte where rId<=a.rId)-a.[出库数量]  from cte as a


对,是为0的,数据是我用文本手动写的

那就行,上面的sql可以得到你想要的結果嗎?


这个方法没有报错,不过计算结果有一部份不对;另外效率也同样很低。返回上面那个1368行的记录所用时间也是两分四十多秒。不知还有没有什么更好的方法?

先執行你得到源數據的查詢,看耗時多長。
可能那一部分應該是你要優化的部分。
------解决思路----------------------
让递归CTE只保留 rn 和 库存余额,要出结果时再和其他字段拼起来。
我这里做模拟递归1000次结果是秒出的。
WITH test AS (
    SELECT 1 RN, 
           Convert(decimal(18,2),RAND()*1000) AS InStore,
           Convert(decimal(18,2),RAND()*1000) AS OutStore
UNION ALL
    SELECT RN+1,
           Convert(decimal(18,2),RAND(RN*OutStore)*1000) AS InStore,
           Convert(decimal(18,2),RAND(RN+InStore)*1000) AS OutStore
      FROM test
     WHERE RN < 1000
)
,CTE AS (
    SELECT RN,
  相关解决方案