求一个类似Excel里面的sumif的问题

qq_38002467 2017-03-21 04:19:01
现在我有一个表里面有流水记录,字段分别为:时间Time,仓位LocCode,数量number,这个数量存在正负数,准确的说就是一个仓库的进出记录。
现在我需要一个查询表结果为

仓位locode,年月,SUM(NUMBER) 当月的进出求和,当月的月初仓库的数量。

我现在不知道怎么求当月月初仓库数量,要求按照仓位和年月group by的。
...全文
211 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_38002467 2017-03-23
  • 打赏
  • 举报
回复
非常感谢,sinat_28984567给出的答案非常完美,多谢
二月十六 2017-03-21
  • 打赏
  • 举报
回复
语句:
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([仓位] nvarchar(22),[数量] int,[时间] Date)
Insert #T
select N'W1',20,'2017/1/2' union all
select N'W1',-10,'2017/2/2' union all
select N'W2',5,'2017/1/4' union all
select N'W3',8,'2017/3/4' union all
select N'W2',9,'2017/2/4' union all
select N'W1',-6,'2017/4/5'
Go
--测试数据结束
;WITH tempa AS (
SELECT 仓位 ,
convert(varchar(7),时间,23) AS 时间 ,
SUM(数量) AS 数量
FROM #T
GROUP BY 仓位 ,
时间
)
SELECT b.仓位 ,
b.数量 ,
b.时间 AS 年月 ,
ISNULL(SUM(a.数量), 0) AS 期初
FROM tempa b
LEFT JOIN tempa a ON a.仓位 = b.仓位
AND CONVERT(DATETIME, b.时间 + '-01') > CONVERT(DATETIME, a.时间
+ '-01')
GROUP BY b.仓位 ,
b.数量 ,
b.时间
ORDER BY b.仓位 ,
b.时间;



结果:
满天飞雪No1 2017-03-21
  • 打赏
  • 举报
回复
create table #table_a(时间 datetime,仓位 int,数量 int) insert into #table_a(时间,仓位,数量) values('2016-01-01',1,100),('2016-01-02',1,-10),('2016-01-01',2,200),('2016-01-02',2,-10), ('2016-02-01',1,100),('2016-02-02',1,-10),('2016-02-01',2,200),('2016-02-02',2,-10), ('2016-03-01',1,100),('2016-03-02',1,-10),('2016-03-01',2,200),('2016-03-02',2,-10) select *,ROW_NUMBER() over(PARTITION BY 仓位 order by 时间 ) 序号 into #table_b from ( select CONVERT(varchar(7),时间,120) 时间,仓位,SUM(数量) 进出求和 from #table_a group by CONVERT(varchar(7),时间,120),仓位) a declare @a int set @a=0 select @a+(select sum(进出求和) from #table_b b1 where b1.序号<=b2.序号 and b2.仓位=b1.仓位)-b2.进出求和 期初,时间,仓位,进出求和 from #table_b b2 drop table #table_a drop table #table_b
唐诗三百首 2017-03-21
  • 打赏
  • 举报
回复
其实用一句SQL可以搞定, 提示: 用outer apply()
qq_38002467 2017-03-21
  • 打赏
  • 举报
回复
对的,但是我无法在一个查询结果中体现出来,如果在Execl中我就能用sumif来实现,但是SQL就不知道怎么来实现了。总不能一个月一个月的来计算吧。。
唐诗三百首 2017-03-21
  • 打赏
  • 举报
回复
一般来讲, 当月月初仓库数量 = 截止到上月月底为止的所有进出数量求和.
qq_38002467 2017-03-21
  • 打赏
  • 举报
回复
w2有条数据错了,应该设定为都是2月份的,但是大致的意思应该能够理解
qq_38002467 2017-03-21
  • 打赏
  • 举报
回复
每个月的求和是能算出来,但是算不出期初,例如数据如下: 仓位 数量 时间 W1 20 2017/1/2 W1 -10 2017/2/2 W2 5 2017/1/4 W3 8 2017/3/4 W2 9 2017/2/4 W1 -6 2017/4/5 要求结果 仓位 数量 年月 期初 W1 20 Jan-17 0 W1 -10 Feb-17 20 W1 -6 Apr-17 10 W2 14 Feb-17 0 W3 8 Mar-17 0
唐诗三百首 2017-03-21
  • 打赏
  • 举报
回复

select 仓位=LocCode,
       年月=convert(varchar(7),[Time],23),
       进出求和=sum(number)
 from [表名]
 group by LocCode,convert(varchar(7),[Time],23)
卖水果的net 2017-03-21
  • 打赏
  • 举报
回复
sum(case when c = 1 then num else 0 end)

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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