各位大哥帮帮忙吧,关于查询语句,帮帮小妹吧

RenXiaoDan 2004-03-26 10:36:32
有一个表是存储入库出库单信息的表GS01,里面记录着很多入库出库信息,里面有字段是'数量','业务'和'编码'和'仓库代码','业务'字段里面记录着是'入库'和'出库'标识,'编码'记录着所有入库出库品种的代码,还有一个表是库存表GS031,有字段期初库存和仓库代码,现在我要把同一种'编码'的品种把它的入库数量、出库数量和库存数量汇总一下
库存数量=gs031 .期初库存 + GS01 业务类型='入库' .数量 - GS01 业务类型='2'. 数量
如果所查询的代码在gs031中没有,那么期初的数量就为0
库存数量=GS01 业务类型='入库' .数量 - GS01 业务类型='2'. 数量

还有一个情况是,在gs031表中有仓库代码这个字段,比如说001000101这个编码的商品在一仓库有200个,在二仓库也有300个,假如我的在查询条件中不选仓库这个条件的话,我就要把一仓库和二仓库是这种编码的商品也一同汇总出来。并且在一条记录显示出来。
希望各位老大帮帮小妹,我会非常感谢你们的
我写了一个语句,但和我所要的查询结果有点不符,希望各位帮忙
Select 仓库名称,GS01.编码,(CASE WHEN GS031.期初数量 IS NULL THEN 0.0 ELSE GS031.期初数量

END) 期初数量,SUM(CASE WHEN 业务类别='1' THEN 数量 ELSE 0 END) 入库数量,SUM(CASE WHEN 业务类

别='2' THEN 数量 ELSE 0 END) 出库数量,(CASE WHEN GS031.期初数量 IS NULL THEN 0 ELSE GS031.期

初数量 END)+SUM(CASE WHEN 业务类别 ='1' THEN 数量 ELSE 0 END)-SUM(CASE WHEN 业务类别='2'

THEN 数量 ELSE 0 END) 库存 From GS01,GS031,GS11 Where (GS01.编码=GS031.编码) AND (GS031.仓库

代码 *=GS11.仓库代码) And (GS01.编码='001000101') AND (GS031.仓库代码='001') GROUP BY GS01.

编码,GS031.期初数量,GS031.仓库代码,GS11.仓库名称
...全文
68 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
RenXiaoDan 2004-03-26
  • 打赏
  • 举报
回复
victorycyz(中海)再问你一个问题,你刚刚给我写的那两个句子差不多都实现了,先谢谢你,但有一个问题不对,你写的那个不分仓查询,比如说:
表gs031里面
仓库代码 编码 期初数量
001 001000101 300
002 001000101 409
表gs01里面
仓库代码 编码 业务 数量
001 001000101 入库 3050
001 001000101 入库 4050
这样查出来的期初数量应该是709对吧,但它只能查出来300,这是怎么回事呢,请帮忙再看一下吧,谢谢啦

RenXiaoDan 2004-03-26
  • 打赏
  • 举报
回复
是不是我把@仓库代码在我的asp文件中里就写成仓库代码='001'这样呢,001是我提交过来的
victorycyz 2004-03-26
  • 打赏
  • 举报
回复


@仓库代码 表示你要查找的仓库,用参数"@仓库代码"传进来。
RenXiaoDan 2004-03-26
  • 打赏
  • 举报
回复
victorycyz(中海)@ 是什么意思了,你那只是分仓查出来,可是我的这种情况不行吧,就是ggs031表中没有gs01中编码的商品
库存数量=gs031 .期初库存 + GS01 业务类型='入库' .数量 - GS01 业务类型='2'. 数量
如果所查询的代码在gs031中没有,那么期初的数量就为0
库存数量=GS01 业务类型='入库' .数量 - GS01 业务类型='2'. 数量
RenXiaoDan 2004-03-26
  • 打赏
  • 举报
回复
是呀,我也觉得很复杂但是没办法
给你几个数据
gs031表:
仓库代码 编码 期初数量
001 001000101 300
002 001000101 400
001 001000103 3999
...
gs01表
仓库代码 编码 业务 数量
001 001000101 入库 3050
002 001000101 入库 4050
001 001000101 出库 3800
001 001000105 入库 3400
001 001000101 出库 3050
001 001000105 入库 3050
001 001000103 入库 3000
002 001000103 出库 3050
....
这就是数据,要求就是我刚刚说的那些,求求你们了,谢谢
victorycyz 2004-03-26
  • 打赏
  • 举报
回复


表GS031中应该有字段“编码”。


如果不分仓库查询:

select a.仓库代码,
a.编码,
sum( case when 业务='入库'
then 数量
else (-1)*数量
end
)-isnull(期初库存,0) as 库存量
from gs01 a left join gs031 b on a.仓库代码=b.仓库代码 and a.编码=b.编码
group by a.仓库代码,a.编码,b.期初库存


分仓查询的话:

select a.仓库代码,
a.编码,
sum(case when 业务='入库' then 数量 else (-1)*数量 end)-isnull(期初库存,0) as 库存量
from gs01 a left join
( select *
from gs031
where 仓库代码=@仓库代码
) b on a.仓库代码=b.仓库代码 and a.编码=b.编码
where a.仓库代码=@仓库代码
group by a.仓库代码,a.编码,b.期初库存
csdnmzk 2004-03-26
  • 打赏
  • 举报
回复
toleeboyan(宝宝) :人家小妹你也小妹,呵呵
leeboyan 2004-03-26
  • 打赏
  • 举报
回复
打错了,小弟!
leeboyan 2004-03-26
  • 打赏
  • 举报
回复
小妹晕了,没数据么,又这么长
csdnmzk 2004-03-26
  • 打赏
  • 举报
回复
为什么你不设置默认值呢?非要进行判断,这样好像弄得很复杂
zheninchangjiang 2004-03-26
  • 打赏
  • 举报
回复
RenXiaoDan 2004-03-26
  • 打赏
  • 举报
回复
最后谢谢你们,谢谢帮我解决问题的所有人
RenXiaoDan 2004-03-26
  • 打赏
  • 举报
回复
先谢谢各位,等我测试完了给大家加分
zjcxc 元老 2004-03-26
  • 打赏
  • 举报
回复
--测试

--测试数据
create table gs031(仓库代码 char(3),编码 char(9),期初数量 int)
insert gs031 select '001','001000101',300
union all select '002','001000101',400
union all select '001','001000103',3999

create table gs01(仓库代码 char(3),编码 char(10),业务 char(4),数量 int)
insert gs01 select '001','001000101','入库',3050
union all select '002','001000101','入库',4050
union all select '001','001000101','出库',3800
union all select '001','001000105','入库',3400
union all select '001','001000101','出库',3050
union all select '001','001000105','入库',3050
union all select '001','001000103','入库',3000
union all select '002','001000103','出库',3050
go

--不分仓库
select a.编码,期初数量=isnull(b.期初数量,0),a.本期入库,a.本期出库
,期末数量=isnull(b.期初数量,0)+a.本期结余
from(
select 编码
,本期入库=sum(case 业务 when '入库' then 数量 else 0 end)
,本期出库=sum(case 业务 when '出库' then 数量 else 0 end)
,本期结余=sum(case 业务 when '入库' then 数量 else -数量 end)
from gs01
group by 编码
)a left join(
select 编码,期初数量=sum(期初数量)
from gs031
group by 编码
)b on a.编码=b.编码

--分仓库
select a.编码,期初数量=isnull(b.期初数量,0),a.本期入库,a.本期出库
,期末数量=isnull(b.期初数量,0)+a.本期结余
from(
select 编码,仓库代码
,本期入库=sum(case 业务 when '入库' then 数量 else 0 end)
,本期出库=sum(case 业务 when '出库' then 数量 else 0 end)
,本期结余=sum(case 业务 when '入库' then 数量 else -数量 end)
from gs01
group by 编码,仓库代码
)a left join(
select 编码,仓库代码,期初数量=sum(期初数量)
from gs031
group by 编码,仓库代码
)b on a.编码=b.编码 and a.仓库代码=b.仓库代码
go

--删除测试
drop table gs031,gs01

/*--测试结果

编码 期初数量 本期入库 本期出库 期末数量
---------- ----------- ----------- ----------- -----------
001000101 700 7100 6850 950
001000103 3999 3000 3050 3949
001000105 0 6450 0 6450

(所影响的行数为 3 行)

编码 期初数量 本期入库 本期出库 期末数量
---------- ----------- ----------- ----------- -----------
001000101 300 3050 6850 -3500
001000101 400 4050 0 4450
001000103 3999 3000 0 6999
001000103 0 0 3050 -3050
001000105 0 6450 0 6450

(所影响的行数为 5 行)
--*/
zjcxc 元老 2004-03-26
  • 打赏
  • 举报
回复
--分仓库
select a.编码,期初数量=isnull(b.期初数量,0),a.本期入库,a.本期出库
,期末数量=isnull(b.期初数量,0)+a.本期结余
from(
select 编码,仓库代码
,本期入库=sum(case 业务 when '入库' then 数量 else 0 end)
,本期出库=sum(case 业务 when '出库' then 数量 else 0 end)
,本期结余=sum(case 业务 when '入库' then 数量 else -数量 end)
from gs01
group by 编码,仓库代码
)a left join(
select 编码,仓库代码,期初数量=sum(期初数量)
from gs031
group by 编码,仓库代码
)b on a.编码=b.编码 and a.仓库代码=b.仓库代码
zjcxc 元老 2004-03-26
  • 打赏
  • 举报
回复
--不分仓库
select a.编码,期初数量=isnull(b.期初数量,0),a.本期入库,a.本期出库
,期末数量=isnull(b.期初数量,0)+a.本期结余
from(
select 编码
,本期入库=sum(case 业务 when '入库' then 数量 else 0 end)
,本期出库=sum(case 业务 when '出库' then 数量 else 0 end)
,本期结余=sum(case 业务 when '入库' then 数量 else -数量 end)
from gs01
group by 编码
)a left join(
select 编码,期初数量=sum(期初数量)
from gs031
group by 编码
)b on a.编码=b.编码

34,591

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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