首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 再来100分,第一次答出的朋友有200分 [已结贴,结贴人:ljupin]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ljupin
    • 等级:
    发表于:2008-07-03 16:27:28 楼主
    中午的贴子100分
    http://topic.csdn.net/u/20080703/12/ef6ff4f4-d085-4c8a-946d-857080f5136d.html

    我的问题如下,对我来说难点在于同时显示出各单位(部门)的领用数量,请高手们,帮帮忙,这是最后一个难题:
    共5个表
    1.物资分类表 (分类ID, 分类名称)
    2.领用单位表 (单位ID, 单位名称)
    3.物资基础表 (物资ID, 物资名称, 物资单价, 当前库存数, 月初库存数, 年初库存数, 库存更新日期)
    4.物资采购表 {ID, 物资ID, 采购数量, 采购单价, 采购日期)
    5.物资出库表 (ID, 物资ID, 领用单位, 领用数量, 领用单价, 领用日期)
    '实际表对应如下
    1.Sol_Class (ClassID, ClassName)
    2.Sol_Depar (Depar_ID, Depar_Name)
    3.Sol_Mat  (Mat_ID, Mat_Name, Mat_Price, Mat_DQKC, Mat_YCKC, Mat_NCKC, Mat_KCRQ)
    4.Sol_At    (At_ID, Mat_ID, At_Num, At_Price, At_Date)
    5.Sol_Wt    (Wt_ID, Mat_ID, Depar_ID, Wt_Num, Wt_Price, Wt_Date)

    实际表就这样,其实Sol_At和Sol_Wt中的Price(单价)只是进出货的价格,盘点时以物资交流基础表(Sol_Mat)的Mat_Price为准,要求查询后如下列出
    ==================================================================================
    1.物资名称  年初数量  年初总金额  本年采购数  本年采购金额  本年出库数  本年出库金额  当前数量 当前总金额  单位1领用数  单位2领用数....(这里单位都显示出来)
    2.....................................
    3.....................................
    4.....................................
    ===================================================================================

    注意:
    1.单位X领用数,就是把单位表中的单位都列出来,并统计出每个物资交的领用数量,当然可能不少物资领用为0
    2.金额的计算直接用数量 * 物资基础表的单价,比如本年采购金额 = 本年采购数 * Mat_Price
    3.而本年采购数和出库数就是今年以来累计的数量,通过Sol_AT和Sol_WT可以计算出来
    4.这样的盘点每个月进行一下,也就说本月第一天盘点出上月末的数据
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • liangCK
    • 等级:
    发表于:2008-07-03 16:29:291楼 得分:3
    有米.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-03 16:30:142楼 得分:0
    单位1领用数  单位2领用数....(这里单位都显示出来)
    ---


    主要行列转换吧

    例子多了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ljupin
    • 等级:
    发表于:2008-07-03 16:31:583楼 得分:0
    楼上的星星,动动手,帮俺解决了吧
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-03 16:42:584楼 得分:5
    就是麻烦!lz也应该自己先弄弄!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-03 16:47:585楼 得分:0
    引用 1 楼 liangCK 的回复:
    有米.


    而且还不少呢!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ljupin
    • 等级:
    发表于:2008-07-03 16:53:066楼 得分:0
    引用 4 楼 hanjs 的回复:
    就是麻烦!lz也应该自己先弄弄!


    兄弟,俺SQL真的很差劲
    现在这是做项目,不是学习,没时间再去研究,客户再催

    大家都能理解我吧,实在没法了,会的朋友帮个忙吧
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-03 17:11:327楼 得分:0
    你把测试数据弄点,否则别人很难帮忙!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-03 17:20:298楼 得分:0
    SQL code
    /*1.物资分类表 (分类ID, 分类名称) 2.领用单位表 (单位ID, 单位名称) 3.物资基础表 (物资ID, 物资名称, 物资单价, 当前库存数, 月初库存数, 年初库存数, 库存更新日期) 4.物资采购表 {ID, 物资ID, 采购数量, 采购单价, 采购日期) 5.物资出库表 (ID, 物资ID, 领用单位, 领用数量, 领用单价, 领用日期) '实际表对应如下 1.Sol_Class (ClassID, ClassName) 2.Sol_Depar (Depar_ID, Depar_Name) 3.Sol_Mat (Mat_ID, Mat_Name, Mat_Price, Mat_DQKC, Mat_YCKC, Mat_NCKC, Mat_KCRQ) 4.Sol_At (At_ID, Mat_ID, At_Num, At_Price, At_Date) 5.Sol_Wt (Wt_ID, Mat_ID, Depar_ID, Wt_Num, Wt_Price, Wt_Date) */ create table Sol_Class (ClassID int, ClassName varchar(10)) insert into sol_class select 1 ,'type1' create table Sol_Depar (Depar_ID int, Depar_Name varchar(10)) insert sol_depar select 1,'depar1' insert sol_depar select 2,'depar2' create table Sol_Mat (Mat_ID int, Mat_Name varchar(10), Mat_Price int, Mat_DQKC int, Mat_YCKC int, Mat_NCKC int, Mat_KCRQ datetime) insert sol_mat select 1,'test1',10,10,5,100,getdate() insert sol_mat select 2,'test2',100,100,50,1000,getdate() create table Sol_At (At_ID int, Mat_ID int, At_Num int, At_Price int, At_Date datetime) insert sol_at select 1,1,10,10,getdate() insert sol_at select 1,2,102,102,getdate() create table Sol_Wt (Wt_ID int, Mat_ID int, Depar_ID int, Wt_Num int, Wt_Price int, Wt_Date datetime) insert sol_Wt select 1,1,1,10,9,getdate() insert sol_Wt select 1,1,2,12,8,getdate() insert sol_Wt select 1,2,1,122,8,getdate() go --1.物资名称 年初数量 年初总金额 本年采购数 本年采购金额 --本年出库数 本年出库金额 当前数量 当前总金额 单位1领用数 单位2领用数....(这里单位都显示出来) select a.mat_id,a.Mat_Name as 物资名称,a.Mat_NCKC as 年初数量,a.Mat_NCKC * a.Mat_Price as 年初总金额, b.sum_at as 本年采购数,b.sum_atj as 本年采购金额, c.sum_wt as 本年出库数,c.sum_wtj as 本年出库金额,Mat_DQKC as 当前数量, a.Mat_DQKC * Mat_Price as 当前总金额,datepart(yy,a.Mat_KCRQ) as n into tmp from Sol_Mat a left join (select mat_id,sum(at_num) as sum_at,sum(at_num * at_price) as sum_atj ,datepart(yy,At_Date) as n from sol_at group by datepart(yy,At_Date) ,mat_id ) b on a.mat_id = b.mat_id and b.n = datepart(yy,a.Mat_KCRQ) left join (select mat_id,sum(wt_num) as sum_wt,sum(wt_num * wt_price) as sum_wtj ,datepart(yy,wt_Date) as n from Sol_Wt group by datepart(yy,wt_Date) ,mat_id ) c on a.mat_id = c.mat_id and b.n = datepart(yy,a.Mat_KCRQ) declare @s varchar(1000) select @s = isnull(@s + ',' ,'') + '[ Depar_'+ Depar_Name+ ']= max(case when Depar_ID = '+ ltrim (Depar_ID)+ ' then Wt_Num end)' from sol_depar exec('select a.物资名称 ,a.年初数量 ,a.年初总金额 ,a.本年采购数 ,a.本年采购金额 ,a.本年出库数 ,a.本年出库金额 ,a.当前数量 ,a.当前总金额,b.* from tmp a left join (select mat_id,'+ @s + ',datepart(yy,wt_Date) as n from Sol_Wt group by mat_id,datepart(yy,wt_Date)) b on a.mat_id = b.mat_id and a.n = b.n') drop table Sol_Class,Sol_Depar,Sol_Mat,Sol_At,Sol_Wt,tmp /* 物资名称 年初数量 年初总金额 本年采购数 本年采购金额 本年出库数 本年出库金额 当前数量 当前总金额 mat_id Depar_depar1 Depar_depar2 n ---------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ------------- ------------- ----------- test1 100 1000 10 100 22 186 10 100 1 10 12 2008 test2 1000 100000 102 10404 122 976 100 10000 2 122 NULL 2008 */
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-03 17:21:139楼 得分:0
    注意:不提供解释服务 
    呵呵
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhuyx808
    • 等级:
    发表于:2008-07-03 17:26:1110楼 得分:3
    我也混个分吧
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ljupin
    • 等级:
    发表于:2008-07-03 17:26:5011楼 得分:0
    先谢谢楼上的星星,俺先慢慢看.....
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-03 17:27:4412楼 得分:3
    狙击手就是强.....学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ljupin
    • 等级:
    发表于:2008-07-03 18:01:4713楼 得分:0
    有2个问题
    1.各统计的总金额应该是 数量 * Mat_Price, 比如本年采购金额应该是 本年采购数 * 物资基础表中的单价
    2.
    declare @s varchar(1000)
    select @s = isnull(@s + ',' ,'') + '[ Depar_'+ Depar_Name+ ']= max(case when  Depar_ID = '+ ltrim (Depar_ID)+ ' then Wt_Num end)'
    from sol_depar

    这就是SQL中的行列转换?还真看不懂


    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-03 18:17:1214楼 得分:0
    引用 13 楼 ljupin 的回复:
    有2个问题
    1.各统计的总金额应该是 数量 * Mat_Price, 比如本年采购金额应该是 本年采购数 * 物资基础表中的单价

    SQL code
    /*1.物资分类表 (分类ID, 分类名称) 2.领用单位表 (单位ID, 单位名称) 3.物资基础表 (物资ID, 物资名称, 物资单价, 当前库存数, 月初库存数, 年初库存数, 库存更新日期) 4.物资采购表 {ID, 物资ID, 采购数量, 采购单价, 采购日期) 5.物资出库表 (ID, 物资ID, 领用单位, 领用数量, 领用单价, 领用日期) '实际表对应如下 1.Sol_Class (ClassID, ClassName) 2.Sol_Depar (Depar_ID, Depar_Name) 3.Sol_Mat (Mat_ID, Mat_Name, Mat_Price, Mat_DQKC, Mat_YCKC, Mat_NCKC, Mat_KCRQ) 4.Sol_At (At_ID, Mat_ID, At_Num, At_Price, At_Date) 5.Sol_Wt (Wt_ID, Mat_ID, Depar_ID, Wt_Num, Wt_Price, Wt_Date) */ create table Sol_Class (ClassID int, ClassName varchar(10)) insert into sol_class select 1 ,'type1' create table Sol_Depar (Depar_ID int, Depar_Name varchar(10)) insert sol_depar select 1,'depar1' insert sol_depar select 2,'depar2' create table Sol_Mat (Mat_ID int, Mat_Name varchar(10), Mat_Price int, Mat_DQKC int, Mat_YCKC int, Mat_NCKC int, Mat_KCRQ datetime) insert sol_mat select 1,'test1',10,10,5,100,getdate() insert sol_mat select 2,'test2',100,100,50,1000,getdate() create table Sol_At (At_ID int, Mat_ID int, At_Num int, At_Price int, At_Date datetime) insert sol_at select 1,1,10,10,getdate() insert sol_at select 1,2,102,102,getdate() create table Sol_Wt (Wt_ID int, Mat_ID int, Depar_ID int, Wt_Num int, Wt_Price int, Wt_Date datetime) insert sol_Wt select 1,1,1,10,9,getdate() insert sol_Wt select 1,1,2,12,8,getdate() insert sol_Wt select 1,2,1,122,8,getdate() go --1.物资名称 年初数量 年初总金额 本年采购数 本年采购金额 --本年出库数 本年出库金额 当前数量 当前总金额 单位1领用数 单位2领用数....(这里单位都显示出来) select a.mat_id,a.Mat_Name as 物资名称,a.Mat_NCKC as 年初数量,a.Mat_NCKC * a.Mat_Price as 年初总金额, b.sum_at as 本年采购数,b.sum_at * Mat_Price as 本年采购金额, c.sum_wt as 本年出库数,c.sum_wt * Mat_Price as 本年出库金额,Mat_DQKC as 当前数量, a.Mat_DQKC * Mat_Price as 当前总金额,datepart(yy,a.Mat_KCRQ) as n into tmp from Sol_Mat a left join (select mat_id,sum(at_num) as sum_at ,datepart(yy,At_Date) as n from sol_at group by datepart(yy,At_Date) ,mat_id ) b on a.mat_id = b.mat_id and b.n = datepart(yy,a.Mat_KCRQ) left join (select mat_id,sum(wt_num) as sum_wt, datepart(yy,wt_Date) as n from Sol_Wt group by datepart(yy,wt_Date) ,mat_id ) c on a.mat_id = c.mat_id and b.n = datepart(yy,a.Mat_KCRQ) declare @s varchar(1000) select @s = isnull(@s + ',' ,'') + '[ Depar_'+ Depar_Name+ ']= max(case when Depar_ID = '+ ltrim (Depar_ID)+ ' then Wt_Num end)' from sol_depar exec('select a.物资名称 ,a.年初数量 ,a.年初总金额 ,a.本年采购数 ,a.本年采购金额 ,a.本年出库数 ,a.本年出库金额 ,a.当前数量 ,a.当前总金额,b.* from tmp a left join (select mat_id,'+ @s + ',datepart(yy,wt_Date) as n from Sol_Wt group by mat_id,datepart(yy,wt_Date)) b on a.mat_id = b.mat_id and a.n = b.n') drop table Sol_Class,Sol_Depar,Sol_Mat,Sol_At,Sol_Wt,tmp /* 物资名称 年初数量 年初总金额 本年采购数 本年采购金额 本年出库数 本年出库金额 当前数量 当前总金额 mat_id Depar_depar1 Depar_depar2 n ---------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ------------- ------------- ----------- test1 100 1000 10 100 22 220 10 100 1 10 12 2008 test2 1000 100000 102 10200 122 12200 100 10000 2 122 NULL 2008 */


    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-03 18:20:3515楼 得分:0
    感冒 了 ,吃药去了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-03 18:50:2016楼 得分:3
    引用 15 楼 happyflystone 的回复:
    感冒 了 ,做俯卧撑去了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-03 19:13:2317楼 得分:3
    引用 16 楼 playwarcraft 的回复:
    引用 15 楼 happyflystone 的回复:
    感冒 了 ,做俯卧撑去了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-03 20:01:1318楼 得分:0
    SQL code
    lz要求单价为物料表出。 create table sol_depar(depar_id int identity,depar_name varchar(10)) insert into sol_depar select 'A' union all select 'B' union all select 'C' create table sol_mat(mat_id int identity,mat_name varchar(10),mat_price decimal(10,2),mat_dqkc int,mat_yckc int,mat_nckc int,mat_kcrq datetime) insert into sol_mat select '',10.25,100,100,100,getdate()-12 union all select '',1.25,100,10,10,getdate()-11 create table sol_at(at_id int identity,mat_id int,at_num int,at_price decimal(10,2),at_date datetime) insert into sol_at select 1,100,10,getdate()-10 union all select 2,10,10,getdate()-10 create table sol_wt(wt_id int identity,mat_id int,depar_id int,wt_num int,wt_price decimal(10,2),wt_date datetime) insert into sol_wt select 1,1,10,10.25,getdate()-9 union all select 2,2,20,10.5,getdate()-8 declare @s varchar(4000) set @s='select mat_name 物资名称,mat_nckc 年初数量,mat_nckc*mat_price 年初总金额,mat_dqkc 当前数量,mat_dqkc*mat_price 当前总金额,c.* ' set @s=@s+'from sol_mat a left join (' set @s=@s+'select b.mat_id,sum(at_num) 采购数,sum(at_num*mat_price) 采购金额 ' set @s=@s+'from sol_at b,sol_mat c where b.mat_id=c.mat_id ' set @s=@s+'group by b.mat_id ) b on a.mat_id=b.mat_id ' set @s=@s+'left join ( ' set @s=@s+'select a.mat_id,sum(wt_num) 出库数,sum(wt_num*mat_price) 出库金额' select @s=@s+','+'['+depar_name+'出库数]=sum(case when depar_id='+ltrim(depar_id)+' then wt_num else 0 end)' from sol_depar select @s=@s+' from sol_wt a,sol_mat b where a.mat_id=b.mat_id group by a.mat_id ) c ' set @s=@s+'on a.mat_id=c.mat_id ' print @s exec(@s) 甲 100 1025.00 100 1025.00 1 10 102.50 10 0 010 12.50 100 125.00 2 20 25.00 0 20 0
    修改