首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

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

2012-03-14 
(急求)多表联合查询,解决问题马上结帖谢谢我有三个表orderinfo、表InputMateriel、表OutputMateriel、表Stock

(急求)多表联合查询,解决问题马上结帖谢谢
我有三个表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




[解决办法]
SQL 如下:

SELECT 
A.ordmcode as '定料单号' ,A.orddsMname as '料名',


B.Iptmcode as '来料单号' ,CONVERT(NVARCHAR(50),A.ordsjdata, 120) as '来料时间' , 
CONVERT(NVARCHAR(50),B.Iptmnum) as '来料数量' , '' as '发料单号' ,
'' as '发料时间' , '' as '发料数量', B.Iptmnum AS '库存' 
FROM orderinfo AS A
INNER JOIN InputMateriel AS B ON A.ordtype = B.Ipttype and A.orddsMname = B.mname
UNION 
SELECT 
restuleTB.ordmcode as '定料单号',restuleTB.orddsMname as '料名',
'' as '来料单号' , '' as '来料时间' , 
'' as '来料数量' ,restuleTB.Optmcode as '发料单号' ,
CONVERT(NVARCHAR(50),restuleTB.mdata, 120) as '发料时间' ,
CONVERT(NVARCHAR(50),restuleTB.Optmnum) as '发料数量',
(CASE WHEN ROW =1 THEN restuleTB.Iptmnum - restuleTB.Optmnum 
ELSE 
(restuleTB.Iptmnum - restuleTB.Optmnum - 
(SELECT SUM(A.Optmnum)
FROM
(SELECT
ROW_NUMBER() OVER(ORDER BY C.mdata) AS ROW,
(C.Optmnum)
FROM orderinfo AS A
INNER JOIN InputMateriel AS B ON A.ordtype = B.Ipttype and A.orddsMname = B.mname
INNER JOIN OutputMateriel AS C ON A.ordtype = C.Opttype and A.orddsMname = C.mname
)AS A WHERE A.ROW <= restuleTB.ROW -1
)
)END) AS '库存' --现在库存=来料数-发料数
 FROM 
(SELECT
ROW_NUMBER() OVER(ORDER BY C.mdata ASC) AS ROW,
A.ordmcode, A.orddsMname, C.Optmcode,
C.mdata, B.Iptmnum, C.Optmnum
FROM orderinfo AS A
INNER JOIN InputMateriel AS B ON A.ordtype = B.Ipttype and A.orddsMname = B.mname
INNER JOIN OutputMateriel AS C ON A.ordtype = C.Opttype and A.orddsMname = C.mname 
) AS restuleTB 
ORDER BY '来料时间' DESC
[解决办法]
好老的贴
[解决办法]
没到一年.
[解决办法]
BS楼上考古的,,,

热点排行