sql server2008一个查询问题,获取期初始数量,业务数据需汇总

满天飞雪No1 2015-05-26 06:08:53
有如下数据
create table #table1 (单号 int,生成时间 datetime)
create table #table2 (单号 int ,商品编号 int ,销售数量 int,来货数量 int,结存数量 int)

insert into #table1(单号,生成时间)
values (10,'2015-01-01'),(11,'2015-01-02'),(12,'2015-01-03')

insert into #table2(单号,商品编号,销售数量,来货数量,结存数量)
values(10,1,0,10,10)
,(10,2,0,5,5)
,(11,1,0,1,11)
,(12,1,3,0,8)
,(12,2,1,0,4)

现需一个语句,按查询的时间段,得到相应的期初数量,各项汇总业务数量,期未数量,但期初数量不能通过 加减得到,必须是获取上一次的结存数量,还需考虚效率,这张表里的数据量会很大,如下
生成时间>='2015-01-01' and 生成为时间是<='2015-01-03'

商品编号 期初数量 销售数量 来货数量 结存数量
1 0 3 11 8
2 0 1 5 4


生成时间>='2015-01-02' and 生成为时间是<='2015-01-03'
商品编号 期初数量 销售数量 来货数量 结存数量
1 10 3 1 8
2 5 1 0 4
...全文
146 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
还在加载中灬 2015-05-27
  • 打赏
  • 举报
回复
DECLARE @StartDate DATETIME,@EndDate DATETIME
SELECT @StartDate='2015-01-01',@EndDate='2015-01-03'
;WITH CTE AS(
    SELECT T2.商品编号
        ,SUM(T2.销售数量)OVER(PARTITION BY T2.商品编号)[销售数量]
        ,SUM(T2.来货数量)OVER(PARTITION BY T2.商品编号)[来货数量]
        ,T2.结存数量
        ,ROW_NUMBER()OVER(PARTITION BY T2.商品编号 ORDER BY T1.生成时间 DESC)RN
    FROM #table1 T1
        JOIN #table2 T2 ON T1.单号=T2.单号
    WHERE T1.生成时间>=@StartDate AND T1.生成时间<=@EndDate
)
SELECT T1.商品编号,ISNULL(T5.结存数量,0) AS[期初数量],T1.销售数量,T1.来货数量,T1.结存数量
FROM CTE T1
    OUTER APPLY(
        SELECT TOP 1 T4.结存数量 FROM #table1 T3 JOIN #table2 T4 ON T3.单号=T4.单号
        WHERE T1.RN=1 AND T1.商品编号=T4.商品编号 AND T3.生成时间<@StartDate
        ORDER BY T3.生成时间 DESC
    )T5
WHERE T1.RN=1
习惯性蹭分 2015-05-26
  • 打赏
  • 举报
回复

create table #table1 (单号 int,生成时间 datetime)
create table #table2 (单号 int ,商品编号 int ,销售数量 int,来货数量 int,结存数量 int)

 insert into #table1(单号,生成时间)
values (10,'2015-01-01')
,(11,'2015-01-02'),
(12,'2015-01-03')

 insert into #table2(单号,商品编号,销售数量,来货数量,结存数量)
values(10,1,0,10,10)
 ,(10,2,0,5,5)
 ,(11,1,0,1,11)
 ,(12,1,3,0,8)
 ,(12,2,1,0,4)
 
 declare @stdate smalldatetime,@endate smalldatetime
 select @stdate='2015-01-02',
        @endate='2015-01-03'
;with sel as
( select a.生成时间,b.单号,商品编号,销售数量,来货数量,结存数量 from #Table1  a
join #table2 b on a.单号=b.单号
)
select a.商品编号, isnull(b.期初,0) as 期初,sum( 销售数量) 销售数量,sum(来货数量) 来货数量,isnull(b.期初,0)+sum(来货数量)- sum( 销售数量) as 结存数量
from sel a
outer apply(select top 1 结存数量 as 期初 from sel where 商品编号=a.商品编号
and 生成时间< @stdate order by 生成时间 desc  ) b
where a.生成时间 between @stdate   and @endate
group by a.商品编号,期初
shoppo0505 2015-05-26
  • 打赏
  • 举报
回复
对于数值不能加减得出,那么你怎么得到总合?

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧