求报表SQL查询语句

Dream_Hunter_ 2009-09-10 02:18:53
现在有三张表:

MaterialStore 原料库存表
ms_ID 此表的主键
m_ID 外键,对应原料表
ms_Date 原料库存发生变化的日期
ms_Worker 盘库人姓名
ms_GoodNum 好品数量
ms_BadNum 次品数量
ms_IsCount 是否是盘库添加的记录
ms_Remark 备注
这个表记录着原料库存变化的情况,即,如果库存减少或增加就添加一条记录

BuyMaterial 原料进库表
bm_ID 此表的主键
m_ID 外键,对应原料表
bm_Code 进库单编号
bm_Num 进库数量
bm_UnitPrice 进库单价
bm_TotalPrice 进库总价
bm_Date 进库日期
bm_IsDeleted 此单是否删除
bm_StaffName 经办人
bm_Invoice 发票编号
此表记录原料进库信息,有原料进库则添加一条记录

SellMaterial 原料出库表
sm_ID 此表的逐渐
c_ID 外键,对应客户表
m_ID 外键,对应原料表
sm_Code 出库单号
sm_Num 出库数量
sm_UnitPrice 出库单价
sm_TotalPrice 出库总价
sm_Date 出库日期
sm_IsDeleted 此单是否已删除
sm_StaffName 经办人
sm_IsOut 是否是为外加工原料
此表记录的原料出库信息,有原料出库则添加一条记录


现在,需要去做报表。
给定某月,需要查询出,该月初的库存量、本月的进库量、本月的出库量、月末量、差额(月初库存+本月进库-本月出库由于丢失可能不等于月末量)。这个查询要怎么写?
小弟第一次做,请前辈指教。
如果对表结构不顺眼的也可以提些建议。
谢谢
...全文
171 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dream_Hunter_ 2009-09-11
  • 打赏
  • 举报
回复
谢谢灰太郎
一些地方还要改改
day(ms_Date)=1
可能1号没记录的
OK LE
阿非 2009-09-10
  • 打赏
  • 举报
回复

[code=SQL]
declare @MaterialStore table(
ms_ID int ,
m_ID int,
ms_Date datetime,
ms_Worker varchar(20),
ms_GoodNum int,
ms_BadNum int,
ms_IsCount int,
ms_Remark varchar(50)
)

declare @BuyMaterial table(
bm_ID int,
m_ID int,
bm_Code int,
bm_Num int,
bm_UnitPrice int,
bm_TotalPrice int,
bm_Date datetime,
bm_IsDeleted int,
bm_StaffName varchar(20),
bm_Invoice int
)

declare @SellMaterial table(
sm_ID int,
c_ID int,
m_ID int,
sm_Code int,
sm_Num int,
sm_UnitPrice int,
sm_TotalPrice int,
sm_Date datetime,
sm_IsDeleted int,
sm_StaffName int,
sm_IsOut int
)

insert into @MaterialStore (ms_ID,ms_GoodNum,ms_Date) select 1, 100, '2009-9-1'
union all select 2, 150, '2009-9-1'
union all select 3, 120, '2009-9-1'
union all select 1, 130, '2009-9-10'
union all select 3, 170, '2009-9-13'
union all select 2, 110, '2009-9-15'


--select ms_ID,ms_GoodNum,ms_Date from @MaterialStore

insert into @BuyMaterial (m_ID,bm_Num,bm_Date) select 1, 30, '2009-9-10'
union all select 3, 50, '2009-9-13'

--select m_ID,bm_Num,bm_Date from @BuyMaterial

insert into @SellMaterial (m_ID, sm_Num, sm_Date) select 2, 40, '2009-9-15'

--select m_ID, sm_Num, sm_Date from @SellMaterial

select ms_ID 编号,
(select ms_GoodNum from @MaterialStore m where day(ms_Date)=1 and m.ms_ID=t.ms_ID ) 期初,
(select isnull(min(bm_Num),0) from @BuyMaterial where m_ID=t.ms_ID ) 本期入库,
(select isnull(min(sm_Num),0) from @SellMaterial where m_ID=t.ms_ID ) 本期出库,
( select ms_GoodNum from @MaterialStore where ms_Date= (select max(ms_Date) from @MaterialStore m where m.ms_ID=t.ms_ID )) 期末结存
from @MaterialStore t
group by ms_ID

编号 期初 本期入库 本期出库 期末结存
1 100 30 0 130
2 150 0 40 110
3 120 50 0 170

[/code]
Dream_Hunter_ 2009-09-10
  • 打赏
  • 举报
回复
我给几个示例数据:
初始数据:
MaterialStore
m_ID ms_Num ms_Date
1 100 2009-9-1
2 150 2009-9-1
3 120 2009-9-1
此时BuyMaterial和SellMaterial还没有数据
9月10号添加1原料30
9月13号添加3原料50
9月15号2原料出库40
后三张表的数据:
BuyMaterial
m_ID bm_Num bm_Date
1 30 2009-9-10
3 50 2009-9-13
SellMaterial
m_ID sm_Num sm_Date
2 40 2009-9-15
MaterialStore
m_ID ms_Num ms_Date
1 100 2009-9-1
2 150 2009-9-1
3 120 2009-9-1
1 130 2009-9-10
3 170 2009-9-13
2 110 2009-9-15
要查询的结果
m_ID lastNum inNum outNum endNum
1 100 30 0 130
2 150 0 40 110
3 120 50 0 170
请大侠看一下。
che2piaopiao 2009-09-10
  • 打赏
  • 举报
回复
帮顶。。
Dream_Hunter_ 2009-09-10
  • 打赏
  • 举报
回复
我顶
Dream_Hunter_ 2009-09-10
  • 打赏
  • 举报
回复
谢谢楼上。
还要月末量的。就是这个不知道怎么写,既要有月初量又要有月末量。
恩。初次设库存的数据库。
我也不知道怎么样好呀。
能不能帮我想想怎么加个月末的量?
谢谢
randomfeel 2009-09-10
  • 打赏
  • 举报
回复

select m_ID,sum(ms_GoodNum) as ms_GoodNum,sum(bm_num) as bm_num,sum(sm_num) as sm_num from(
select m_ID,ms_GoodNum,bm_num=0,sm_num=0 from (select top 1 m_ID,ms_GoodNum from MaterialStore where ms_Date < '2009-9-1' order by ms_Date desc) t1
union
select m_ID,ms_GoodNum=0,bm_num,sm_num from (select m_ID,sum(b.bm_Num) as bm_Num,sm_Num=0 from BuyMaterial group by m_ID having bm_Date < '2009-9-1') t2
union
select m_ID,ms_GoodNum=0,bm_num,sm_num from (select m_ID,bm_Num=0,sum(sm_Num) as sm_num from BuyMaterial group by m_ID having sm_Date < '2009-9-1') t3
) t
group by m_ID


改成这样了,应该可以吧
你的表这样设计,写得真痛苦
randomfeel 2009-09-10
  • 打赏
  • 举报
回复
上面写错了
sum(m.ms_GoodNum),max(m.ms_Date)
这两个字段是错的
不习惯你的库存规则
randomfeel 2009-09-10
  • 打赏
  • 举报
回复
如果给定 2009-9月份
select m.m_ID,sum(m.ms_GoodNum) as total_num,sum(b.bm_Num) as bm_Num,sum(s.sm_Num) as sm_Num,max(m.ms_Date) 
from MaterialStore m
join BuyMaterial b on m.m_ID=b.m_ID
join SellMaterial s on m.m_ID=s.m_ID
group by m.m_ID having m.ms_Date < '2009-9-1'


没建表调试,不知道对不对,大概是这样的思路吧

ps:1、你还没提供原料表,所以只是统计出m_ID的数量等,没有材料名称
2、数据库最好别这样设计,以后慢慢改进吧~~
Dream_Hunter_ 2009-09-10
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 randomfeel 的回复:]
晕,你加了A材料50,是对数据库这样操作的
这样的数据库设计,冗余得很厉害

按照你的要求写sql的话,还不清楚你的库存表里的好品、次品是不是都统计?进、出库表的是否已删除这个字段的规则是怎么定的?
[/Quote]
但是要知道某时刻的库存量,还有别的方法吗?每次都查询现有库存,然后根据进出库记录将以前的记录计算出来?
好品次品都一样吧。只要统计好品。
是否已删除这个字段可以先不管的。
说实话,我也不知道怎么设计好,这是我第一次做,就按自己的想法搞了。
randomfeel 2009-09-10
  • 打赏
  • 举报
回复
晕,你加了A材料50,是对数据库这样操作的
这样的数据库设计,冗余得很厉害

按照你的要求写sql的话,还不清楚你的库存表里的好品、次品是不是都统计?进、出库表的是否已删除这个字段的规则是怎么定的?
Dream_Hunter_ 2009-09-10
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 randomfeel 的回复:]
不知道你的表设计的思路,还是写不出

[/Quote]
MaterialStore的信息是某时刻的库存情况,
比如,原始库存,材料A有100,材料B有200,材料C有300
那MaterialStore表的数据有
A 100 2009-1-1
B 200 2009-1-1
C 300 2009-1-1
2009-10-1添加原料A 50
则MaterialStore表的数据添加一条后变成
A 100 2009-1-1
B 200 2009-1-1
C 300 2009-1-1
A 150 2009-10-1
BuyMaterial和SellMaterial是对进出库做的详细记录
randomfeel 2009-09-10
  • 打赏
  • 举报
回复
不知道你的表设计的思路,还是写不出
Dream_Hunter_ 2009-09-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lovely_baby 的回复:]
使用存储过程 的数据 在页面绑定
然后通过程序打印
[/Quote]
就是存储过程的查询不会写。。。
Lovely_baby 2009-09-10
  • 打赏
  • 举报
回复
使用存储过程 的数据 在页面绑定
然后通过程序打印
Dream_Hunter_ 2009-09-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 randomfeel 的回复:]
这种业务不熟
月初的库存量、月末量等是由哪个表的哪个字段决定的?
[/Quote]
这些都在MaterialStore表里,这个这个表里的数据反映的是库存情况,即某时刻库存有多少。只是在库存发生变化时,才做记录。
Dream_Hunter_ 2009-09-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 gwf25sz 的回复:]
触发器控制级联更新,存储过程用来 拿你要的数据
[/Quote]
能不能具体一点。不会呀。

呵呵。我的头像比你清晰哦。
我自己做着试试的。
randomfeel 2009-09-10
  • 打赏
  • 举报
回复
这种业务不熟
月初的库存量、月末量等是由哪个表的哪个字段决定的?
gwf25sz 2009-09-10
  • 打赏
  • 举报
回复
兄弟你也是路飞???

你也做ERP?

这个问题我2个月前才做的~~~~~~
gwf25sz 2009-09-10
  • 打赏
  • 举报
回复
触发器控制级联更新,存储过程用来 拿你要的数据

62,039

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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