您的位置:程序门 -> ms-sql server -> 基础类



(急求)多表联合查询,解决问题马上结帖谢谢


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


(急求)多表联合查询,解决问题马上结帖谢谢[已结贴,结贴人:softwklc]
发表于:2007-04-23 08:59:45 楼主
我有三个表orderinfo、表inputmateriel、表outputmateriel、表stockpileinfo
-----------inputmateriel表结构如下:---------------------订料表
类型         供应商名   订料单号   订料名称       数量           要求到料时间   实际到料时间
ordtype   proname     ordmcode   orddsmname   ordnumber       ordsqdata       ordsjdata
-----------inputmateriel表结构如下:---------------------来料表
类型         来料时间   来料单号   料名,供应商,来料数    
ipttype   mdata         iptmcode   mname   pname       iptmnum  
-----------outputmateriel表结构如下:--------------------发料表
类型         来料时间   来料单号   料名,供应商,来料数    
opttype   mdata         optmcode   mname   pname       optmnum    
-----------stockpileinfo表结构如下:---------------------库存表
类型     料名       库存数
stotype   mname     stomnum       进料之前此表是空表
-------------------------------------------------------
原始数据
-------------------------------------------------------------------------
select   *   from   orderinfo
结果:类型   供应商名   订料单号   订料名称     数量       要求到料时间   实际到料时间
            1001   一厂           a-1001       电源             200         2007-04-10       2007-04-12
            1002   二厂           b-1001       电容             100         2007-04-12       2007-04-12  
select   *   from   inputmateriel  
      结果:类型     料名   供应商   来料单号   来料时间       来料数  
                1001     电源     一厂     al-1001       2007-04-12     200        
                1001     电容     二厂     bl-1001       2007-04-15     100                
select   *   from   outputmateriel  
      结果:类型     料名   供应商   发料单号   发料时间    发料数
                1001     电源     一厂     af-1001       2007-04-13     100
                1001     电源     一厂     af-1002       2007-04-15     30
                1001     电源     一厂     af-1003       2007-04-16     20
select   *   from   stockpileinfo   (此表实时更新,来一批料现库存+来料数,发一批料现库存-发料数)
结果:类型 料名 现库存    
          1001     电源 50    
          1002     电容 100
-------------------------------------------------------------------------
注释:1、(来料时间=实际到料时间)2、(现在库存=来料数-发料数)
我的四个查询语句
-------------------------------------------------------------------------
1、
select   *   from   orderinfo   where   ordtype= '1001 '   and   orddsmname= '电源 '   and   ordsjdata   between   '2007-04-10 '   and   '2007-04-20 '
      结果:类型   供应商名   订料单号   订料名称     数量       要求到料时间   实际到料时间
                  1001   一厂           a-1001       电源             200         2007-04-10       2007-04-12
2、
select   *   from   inputmateriel   where   ipttype= '1001 'and   mname= '电源 'and   mdata   between   '2007-04-10 '   and   '2007-04-20 '
      结果:类型     料名   供应商   来料单号   来料时间       来料数  
                1001     电源     一厂     al-1001     2007-04-12     200        
3、
select   *   from   outputmateriel   where   opttype= '1001 'and   mname= '电源 'and   mdata   between   '2007-04-10 '   and   '2007-04-20 '
      结果:类型     料名   供应商   发料单号   发料时间    发料数  
                1001     电源     一厂     af-1001       2007-04-13     100
                1001     电源     一厂     af-1002       2007-04-15     30  
                1001     电源     一厂     af-1003       2007-04-16     20    
4、
select   *   from   stockpileinfo    
结果:类型 料名 现库存    
          1001     电源 50
          1002     电容 100
------------------------------------------------------------------------
怎么按(类型、料名、mdata)结合三个表查询得到如下结果:按时间排序
订料单号料名   来料单号   来料时间     来料数量   发料单号   发料时间   发料数量   库存
a-1001       电源   al-1001     2007-04-12   200                                                                 200
a-1001       电源                                                           af-1001     2007-04-13   100         100    
a-1001       电源                                                           af-1002     2007-04-15     30         70
a-1001       电源                                                           af-1003     2007-04-16     20         50
发表于:2007-04-23 09:40:101楼 得分:0
1:你的stockpileinfo表是不是直接偶数据,不需要自己计算?
2:你的表结构有了,但是看不出来表之间怎么关联?
发表于:2007-04-23 10:32:352楼 得分:100
drop   table   orderinfo,inputmateriel,outputmateriel,stockpileinfo
go
create   table   orderinfo(ordtype   varchar(10),proname   varchar(100),ordmcode   varchar(20),orddsmname   varchar(255),ordnumber   numeric(20,6),ordsqdata   datetime,ordsjdata   datetime)
create   table   inputmateriel(ipttype   varchar(10),mdata   datetime,iptmcode   varchar(20),mname   varchar(255),pname   varchar(100),iptmnum   numeric(20,6))
create   table   outputmateriel(opttype   varchar(10),mdata   datetime,optmcode   varchar(20),mname   varchar(255),pname   varchar(100),optmnum   numeric(20,6))
create   table   stockpileinfo(stotype   varchar(10),mname   varchar(255),stomnum   numeric(20,6))

insert   into   orderinfo
select   '1001 ', '一厂 ', 'a-1001 ', '电源 ',200, '2007-04-10 ', '2007-04-12 '
union   all   select   '1002 ', '二厂 ', 'b-1001 ', '电容 ',100, '2007-04-12 ', '2007-04-12 '

insert   into   inputmateriel(ipttype,mname,pname,iptmcode,mdata,iptmnum)
select   '1001 ', '电源 ', '一厂 ', 'al-1001 ', '2007-04-12 ',200
union   all   select   '1002 ', '电容 ', '二厂 ', 'bl-1001 ', '2007-04-15 ',100

insert   into   outputmateriel(opttype,mname,pname,optmcode,mdata,optmnum)
select   '1001 ', '电源 ', '一厂 ', 'af-1001 ', '2007-04-13 ',100
union   all   select   '1001 ', '电源 ', '一厂 ', 'af-1002 ', '2007-04-15 ',30
union   all   select   '1001 ', '电源 ', '一厂 ', 'af-1003 ', '2007-04-16 ',20
union   all   select   '1002 ', '电容 ', '二厂 ', 'af-1004 ', '2007-04-20 ',10
union   all   select   '1002 ', '电容 ', '二厂 ', 'af-1005 ', '2007-04-21 ',50
 
insert   into   stockpileinfo
select   '1001 ', '电源 ',50    
union   all   select   '1002 ', '电容 ',40

select   *   from   (
select   b.ordmcode   as   '订料单号 ',
a.mname   as   '料名 ',
a.iptmcode   as   '来料单号 ',
convert(char(10),a.mdata,120)   as   '来料时间 ',
a.iptmnum   as   '来料数量 ',
null   as   '发料单号 ',
null   as   '发料时间 ',
null   as   '发料数量 ',
a.iptmnum   as   '库存 '
from   inputmateriel   a
inner   join   orderinfo   b   on   a.ipttype=b.ordtype   and   a.mname=b.orddsmname
union   all
select   b.ordmcode,
c.mname,
null,
null,
null,
c.optmcode,
convert(char(10),c.mdata,120),
c.optmnum,
isnull((select   sum(isnull(optmnum,0))+x.stomnum   from   outputmateriel   y   where   y.opttype=c.opttype   and   y.mname=c.mname   and   c.mdata <y.mdata),x.stomnum)
from   outputmateriel   c
inner   join   orderinfo   b   on   c.opttype=b.ordtype   and   c.mname=b.orddsmname
inner   join   stockpileinfo   x   on   x.stotype=c.opttype   and   x.mname=c.mname)t
order   by   订料单号,料名,来料单号   desc

/*
订料单号 料名 来料单号 来料时间 来料数量 发料单号 发料时间 发料数量 库存
--------------------------------------------------------------------------------------------
a-1001 电源 al-1001 2007-04-12 200.000000 null null null 200.000000
a-1001 电源 null null null af-1001 2007-04-13 100.000000 100.000000
a-1001 电源 null null null af-1002 2007-04-15 30.000000 70.000000
a-1001 电源 null null null af-1003 2007-04-16 20.000000 50.000000
b-1001 电容 bl-1001 2007-04-15 100.000000 null null null 100.000000
b-1001 电容 null null null af-1004 2007-04-20 10.000000 90.000000
b-1001 电容 null null null af-1005 2007-04-21 50.000000 40.000000
*/


快速检索

热门点击