现在调试出来的结果有空行(调入,调出部分有问题),初存和结存不正确.SQL:
--查询时间段定义
DECLARE @dt1 smalldatetime,@dt2 smalldatetime
SELECT @dt1='2005-1-1',@dt2='2006-3-10'--查询
--期初库存年月及计算期初数的开始时间)
DECLARE @dt smalldatetime
SELECT @dt=DATEADD(Day,1-Day(@dt1),@dt1)--查询期初库存
SELECT 
物料=ISNULL(a.物料,b.物料),
日期=ISNULL(b.日期,@dt1),
供应商=ISNULL(a.供应商,b.供应商),
供应商型号=ISNULL(a.供应商型号,b.供应商型号),
仓库=ISNULL(a.仓库,b.仓库),
    初存=ISNULL(a.结存,0)+ISNULL(b.初存,0) + ISNULL(c.初存,0)+ISNULL(d.初存,0)+ISNULL(e.初存,0)    ,
    入库=ISNULL(b.[入库],0),
    发料=ISNULL(b.[发料],0),
    退料=ISNULL(b.[退料],0),
    退货=ISNULL(b.[退货],0),
    报废=ISNULL(b.[报废],0),
调入=ISNULL(c.[调入],0),
调出=ISNULL(d.[调出],0),
拆卸=ISNULL(e.[拆卸],0),
    结存=ISNULL(a.结存,0)+ISNULL(b.初存,0)+ISNULL(b.末存,0)+ISNULL(c.初存,0)+ISNULL(c.末存,0)+ISNULL(d.初存,0)+ISNULL(d.末存,0)+ISNULL(e.初存,0)+ISNULL(e.末存,0)
FROM(SELECT 物料,供应商,供应商型号,仓库,结存 FROM Stocks)a  --期初数 
-------------------------------------------------
FULL JOIN(
SELECT 
td.物料,
    tm.日期,    
    td.供应商,
td.供应商型号,
tm.仓库,
初存=(SELECT SUM(CASE WHEN Flag=0 OR Flag=2 THEN tb.数量 ELSE -tb.数量 END)
        FROM tb,tbm WHERE  tbm.日期>=@dt AND tbm.日期<MIN(tm.日期) AND tb.单号 = tbm.单号 AND tb.物料=td.物料 And tb.供应商 = td.供应商 And tb.供应商型号 = td.供应商型号),
    入库=SUM(CASE WHEN Flag=0 THEN 数量 END),
发料=SUM(CASE WHEN Flag=1 THEN 数量 END),
    退料=SUM(CASE WHEN Flag=2 THEN 数量 END),
    退货=SUM(CASE WHEN Flag=3 THEN 数量 END),
    报废=SUM(CASE WHEN Flag=4 THEN 数量 END),
    末存=SUM(CASE WHEN Flag=0 OR Flag=2 THEN 数量 ELSE -数量 END)
FROM tb td,tbm tm 
WHERE tm.日期>=@dt1 AND tm.日期<DATEADD(Day,1,@dt2) And tm.单号 = td.单号
GROUP BY tm.日期,td.物料,td.供应商,td.供应商型号,tm.仓库
)b ON a.物料=b.物料 And a.供应商 = b.供应商 And a.供应商型号 = b.供应商型号 And a.仓库 = b.仓库 --0代表入库,1代表发料,2代表退料,3代表退货,4代表报废
-------------------------------------------------
FULL JOIN(
SELECT 
td.物料,
    tm.日期,    
    td.供应商,
td.供应商型号,
tm.调入仓库 AS 仓库,
初存=(SELECT SUM(trb.数量)
        FROM trb,trbm WHERE  trbm.日期>=@dt AND trbm.日期<MIN(tm.日期) AND trb.单号 = trbm.单号 AND trb.物料=td.物料 And trb.供应商 = td.供应商 And trb.供应商型号 = td.供应商型号),
    调入=SUM(td.数量),
末存=SUM(td.数量)
FROM trb td,trbm tm
WHERE tm.日期>=@dt1 AND tm.日期<DATEADD(Day,1,@dt2) And tm.单号 = td.单号
GROUP BY tm.日期,td.物料,td.供应商,td.供应商型号,tm.调入仓库
)c ON a.物料=c.物料 And a.供应商 = c.供应商 And a.供应商型号 = c.供应商型号 And a.仓库 = c.仓库
-------------------------------------------------
FULL JOIN(
SELECT 
td.物料,
    tm.日期,    
    td.供应商,
td.供应商型号,
tm.调出仓库 AS 仓库,
初存=(SELECT SUM(-trb.数量)
        FROM trb,trbm WHERE  trbm.日期>=@dt AND trbm.日期<MIN(tm.日期) AND trb.单号 = trbm.单号 AND trb.物料=td.物料 And trb.供应商 = td.供应商 And trb.供应商型号 = td.供应商型号),
    调出=SUM(td.数量),
    末存=SUM(-td.数量)
FROM trb td,trbm tm
WHERE tm.日期>=@dt1 AND tm.日期<DATEADD(Day,1,@dt2) And tm.单号 = td.单号
GROUP BY tm.日期,td.物料,td.供应商,td.供应商型号,tm.调出仓库
)d ON a.物料=d.物料 And a.供应商 = d.供应商 And a.供应商型号 = d.供应商型号 And a.仓库 = d.仓库
-------------------------------------------------
FULL JOIN(
SELECT 
td.物料,
    tm.日期,    
    td.供应商,
td.供应商型号,
td.仓库,
初存=(SELECT SUM(-tdb.数量)
        FROM tdb,tdbm WHERE  tdbm.日期>=@dt AND tdbm.日期<MIN(tm.日期) AND tdb.单号 = tdbm.单号 AND tdb.物料=td.物料 And tdb.供应商 = td.供应商 And tdb.供应商型号 = td.供应商型号 And tdb.拆卸入库 = 1),
    拆卸=SUM(td.数量),
    末存=SUM(-td.数量)
FROM tdb td,tdbm tm
WHERE tm.日期>=@dt1 AND tm.日期<DATEADD(Day,1,@dt2) And tm.单号 = td.单号 And td.拆卸入库 = 1
GROUP BY tm.日期,td.物料,td.供应商,td.供应商型号,td.仓库
)e ON a.物料=e.物料 And a.供应商 = e.供应商 And a.供应商型号 = e.供应商型号 And a.仓库 = e.仓库
ORDER BY 物料,供应商,供应商型号

解决方案 »

  1.   

    原语句有错,聚合或其他 SET 操作消除了空值,修改后能不出错误,不过,明细不是楼主要的。先贴代码。接着改--查询时间段定义
    DECLARE @dt1 smalldatetime,@dt2 smalldatetime
    SELECT @dt1='2005-1-1',@dt2='2006-3-10'--查询
    --期初库存年月及计算期初数的开始时间)
    DECLARE @dt smalldatetime
    SELECT @dt=DATEADD(Day,1-Day(@dt1),@dt1)--查询期初库存
    SELECT 
        物料=ISNULL(ISNULL(a.物料,b.物料),0),
        日期=ISNULL(b.日期,@dt1),
        供应商=ISNULL(ISNULL(a.供应商,b.供应商),0),
        供应商型号=ISNULL(ISNULL(a.供应商型号,b.供应商型号),0),
        仓库=ISNULL(ISNULL(a.仓库,b.仓库),0),
        初存=ISNULL(a.结存,0)+ISNULL(b.初存,0) + ISNULL(c.初存,0)+ISNULL(d.初存,0)+ISNULL(e.初存,0)    ,
        入库=ISNULL(b.[入库],0),
        发料=ISNULL(b.[发料],0),
        退料=ISNULL(b.[退料],0),
        退货=ISNULL(b.[退货],0),
        报废=ISNULL(b.[报废],0),
        调入=ISNULL(c.[调入],0),
        调出=ISNULL(d.[调出],0),
        拆卸=ISNULL(e.[拆卸],0),
        结存=ISNULL(a.结存,0)+ISNULL(b.初存,0)+ISNULL(b.末存,0)+ISNULL(c.初存,0)+ISNULL(c.末存,0)+ISNULL(d.初存,0)+ISNULL(d.末存,0)+ISNULL(e.初存,0)+ISNULL(e.末存,0)
    FROM(SELECT 物料,供应商,供应商型号,仓库,结存 FROM Stocks)a  --期初数 
    -------------------------------------------------
    FULL JOIN(
    SELECT 
        td.物料,
        tm.日期,    
        td.供应商,
        td.供应商型号,
        tm.仓库,
        初存=(SELECT SUM(CASE WHEN Flag=0 OR Flag=2 THEN tb.数量 ELSE -tb.数量 END)
            FROM tb,tbm WHERE  tbm.日期>=@dt AND tbm.日期<MIN(tm.日期) AND tb.单号 = tbm.单号 AND tb.物料=td.物料 And tb.供应商 = td.供应商 And tb.供应商型号 = td.供应商型号),
        入库=SUM(CASE WHEN Flag=0 THEN 数量 END),
        发料=SUM(CASE WHEN Flag=1 THEN 数量 END),
        退料=SUM(CASE WHEN Flag=2 THEN 数量 END),
        退货=SUM(CASE WHEN Flag=3 THEN 数量 END),
        报废=SUM(CASE WHEN Flag=4 THEN 数量 END),
        末存=SUM(CASE WHEN Flag=0 OR Flag=2 THEN 数量 ELSE -数量 END)
    FROM tb td,tbm tm 
    WHERE tm.日期>=@dt1 AND tm.日期<DATEADD(Day,1,@dt2) And tm.单号 = td.单号
    GROUP BY tm.日期,td.物料,td.供应商,td.供应商型号,tm.仓库
    )b ON a.物料=b.物料 And a.供应商 = b.供应商 And a.供应商型号 = b.供应商型号 And a.仓库 = b.仓库 --0代表入库,1代表发料,2代表退料,3代表退货,4代表报废
    -------------------------------------------------
    FULL JOIN(
    SELECT 
        td.物料,
        tm.日期,    
        td.供应商,
        td.供应商型号,
        tm.调入仓库 AS 仓库,
        初存=(SELECT SUM(trb.数量)
            FROM trb,trbm WHERE  trbm.日期>=@dt AND trbm.日期<MIN(tm.日期) AND trb.单号 = trbm.单号 AND trb.物料=td.物料 And trb.供应商 = td.供应商 And trb.供应商型号 = td.供应商型号),
        调入=SUM(td.数量),
        末存=SUM(td.数量)
    FROM trb td,trbm tm
    WHERE tm.日期>=@dt1 AND tm.日期<DATEADD(Day,1,@dt2) And tm.单号 = td.单号
    GROUP BY tm.日期,td.物料,td.供应商,td.供应商型号,tm.调入仓库
    )c ON a.物料=c.物料 And a.供应商 = c.供应商 And a.供应商型号 = c.供应商型号 And a.仓库 = c.仓库
    -------------------------------------------------
    FULL JOIN(
    SELECT 
        td.物料,
        tm.日期,    
        td.供应商,
        td.供应商型号,
        tm.调出仓库 AS 仓库,
        初存=(SELECT SUM(-trb.数量)
            FROM trb,trbm WHERE  trbm.日期>=@dt AND trbm.日期<MIN(tm.日期) AND trb.单号 = trbm.单号 AND trb.物料=td.物料 And trb.供应商 = td.供应商 And trb.供应商型号 = td.供应商型号),
        调出=SUM(td.数量),
        末存=SUM(-td.数量)
    FROM trb td,trbm tm
    WHERE tm.日期>=@dt1 AND tm.日期<DATEADD(Day,1,@dt2) And tm.单号 = td.单号
    GROUP BY tm.日期,td.物料,td.供应商,td.供应商型号,tm.调出仓库
    )d ON a.物料=d.物料 And a.供应商 = d.供应商 And a.供应商型号 = d.供应商型号 And a.仓库 = d.仓库
    -------------------------------------------------
    FULL JOIN(
    SELECT 
        td.物料,
        tm.日期,    
        td.供应商,
        td.供应商型号,
        td.仓库,
        初存=(SELECT SUM(-tdb.数量)
            FROM tdb,tdbm WHERE  tdbm.日期>=@dt AND tdbm.日期<MIN(tm.日期) AND tdb.单号 = tdbm.单号 AND tdb.物料=td.物料 And tdb.供应商 = td.供应商 And tdb.供应商型号 = td.供应商型号 And tdb.拆卸入库 = 1),
        拆卸=SUM(td.数量),
        末存=SUM(-td.数量)
    FROM tdb td,tdbm tm
    WHERE tm.日期>=@dt1 AND tm.日期<DATEADD(Day,1,@dt2) And tm.单号 = td.单号 And td.拆卸入库 = 1
    GROUP BY tm.日期,td.物料,td.供应商,td.供应商型号,td.仓库
    )e ON a.物料=e.物料 And a.供应商 = e.供应商 And a.供应商型号 = e.供应商型号 And a.仓库 = e.仓库
    ORDER BY 物料,供应商,供应商型号
      

  2.   

    问题出在full join c表那里。还在研究
      

  3.   

        初存=(SELECT SUM(trb.数量)
            FROM trb,trbm WHERE  
    trb.单号 = trbm.单号
    AND trbm.日期>=@dt AND trbm.日期<min(tm.日期)
    AND trb.物料=td.物料 
    And trb.供应商 = td.供应商 
    And trb.供应商型号 = td.供应商型号),这里出问题了。
    正在研究业务逻辑。晕死了
    halo!
      

  4.   


    --查询时间段定义
    DECLARE @dt1 smalldatetime,@dt2 smalldatetime
    SELECT @dt1='2005-1-1',@dt2='2006-3-10'--查询
    --期初库存年月及计算期初数的开始时间)
    DECLARE @dt smalldatetime
    SELECT @dt=DATEADD(Day,1-Day(@dt1),@dt1)--查询期初库存
    SELECT 
        物料=isnull(isnull(isnull(ISNULL(a.物料,b.物料),c.物料),d.物料),e.物料),
        日期=ISNULL(b.日期,@dt1),
        供应商=isnull(isnull(isnull(ISNULL(a.供应商,b.供应商),c.供应商),d.供应商),e.供应商),
        供应商型号=isnull(isnull(isnull(ISNULL(a.供应商型号,b.供应商型号),c.供应商),d.供应商),e.供应商),
        仓库=ISNULL(ISNULL(a.仓库,b.仓库),0),
        初存=ISNULL(a.结存,0)+ISNULL(b.初存,0) + ISNULL(c.初存,0)+ISNULL(d.初存,0)+ISNULL(e.初存,0)    ,
        入库=ISNULL(b.[入库],0),
        发料=ISNULL(b.[发料],0),
        退料=ISNULL(b.[退料],0),
        退货=ISNULL(b.[退货],0),
        报废=ISNULL(b.[报废],0),
        调入=ISNULL(c.[调入],0),
        调出=ISNULL(d.[调出],0),
        拆卸=ISNULL(e.[拆卸],0),
        结存=ISNULL(a.结存,0)+ISNULL(b.初存,0)+ISNULL(b.末存,0)+ISNULL(c.初存,0)+ISNULL(c.末存,0)+ISNULL(d.初存,0)+ISNULL(d.末存,0)+ISNULL(e.初存,0)+ISNULL(e.末存,0)
    FROM(SELECT 物料,供应商,供应商型号,仓库,结存 FROM Stocks)a  --期初数 
    -------------------------------------------------
    FULL JOIN(
    SELECT 
        td.物料,
        tm.日期,    
        td.供应商,
        td.供应商型号,
        tm.仓库,
        初存=(SELECT SUM(CASE WHEN Flag=0 OR Flag=2 THEN tb.数量 ELSE -tb.数量 END)
            FROM tb,tbm WHERE  tbm.日期>=@dt AND tbm.日期<MIN(tm.日期) AND tb.单号 = tbm.单号 AND tb.物料=td.物料 And tb.供应商 = td.供应商 And tb.供应商型号 = td.供应商型号),
        入库=SUM(CASE WHEN Flag=0 THEN 数量 END),
        发料=SUM(CASE WHEN Flag=1 THEN 数量 END),
        退料=SUM(CASE WHEN Flag=2 THEN 数量 END),
        退货=SUM(CASE WHEN Flag=3 THEN 数量 END),
        报废=SUM(CASE WHEN Flag=4 THEN 数量 END),
        末存=SUM(CASE WHEN Flag=0 OR Flag=2 THEN 数量 ELSE -数量 END)
    FROM tb td,tbm tm 
    WHERE tm.日期>=@dt1 AND tm.日期<DATEADD(Day,1,@dt2) And tm.单号 = td.单号
    GROUP BY tm.日期,td.物料,td.供应商,td.供应商型号,tm.仓库
    )b ON a.物料=b.物料 And a.供应商 = b.供应商 And a.供应商型号 = b.供应商型号 And a.仓库 = b.仓库 --0代表入库,1代表发料,2代表退料,3代表退货,4代表报废
    -------------------------------------------------
    FULL JOIN(
    SELECT 
        td.物料,
        tm.日期,    
        td.供应商,
        td.供应商型号,
        tm.调入仓库 AS 仓库,
        初存=(SELECT SUM(trb.数量)
            FROM trb,trbm WHERE  trbm.日期>=@dt AND trbm.日期<MIN(tm.日期) AND trb.单号 = trbm.单号 AND trb.物料=td.物料 And trb.供应商 = td.供应商 And trb.供应商型号 = td.供应商型号),
        调入=SUM(td.数量),
        末存=SUM(td.数量)
    FROM trb td,trbm tm
    WHERE tm.日期>=@dt1 AND tm.日期<DATEADD(Day,1,@dt2) And tm.单号 = td.单号
    GROUP BY tm.日期,td.物料,td.供应商,td.供应商型号,tm.调入仓库
    )c ON a.物料=c.物料 And a.供应商 = c.供应商 And a.供应商型号 = c.供应商型号 And a.仓库 = c.仓库
    -------------------------------------------------
    FULL JOIN(
    SELECT 
        td.物料,
        tm.日期,    
        td.供应商,
        td.供应商型号,
        tm.调出仓库 AS 仓库,
        初存=(SELECT SUM(-trb.数量)
            FROM trb,trbm WHERE  trbm.日期>=@dt AND trbm.日期<MIN(tm.日期) AND trb.单号 = trbm.单号 AND trb.物料=td.物料 And trb.供应商 = td.供应商 And trb.供应商型号 = td.供应商型号),
        调出=SUM(td.数量),
        末存=SUM(-td.数量)
    FROM trb td,trbm tm
    WHERE tm.日期>=@dt1 AND tm.日期<DATEADD(Day,1,@dt2) And tm.单号 = td.单号
    GROUP BY tm.日期,td.物料,td.供应商,td.供应商型号,tm.调出仓库
    )d ON a.物料=d.物料 And a.供应商 = d.供应商 And a.供应商型号 = d.供应商型号 And a.仓库 = d.仓库
    -------------------------------------------------
    FULL JOIN(
    SELECT 
        td.物料,
        tm.日期,    
        td.供应商,
        td.供应商型号,
        td.仓库,
        初存=(SELECT SUM(-tdb.数量)
            FROM tdb,tdbm WHERE  tdbm.日期>=@dt AND tdbm.日期<MIN(tm.日期) AND tdb.单号 = tdbm.单号 AND tdb.物料=td.物料 And tdb.供应商 = td.供应商 And tdb.供应商型号 = td.供应商型号 And tdb.拆卸入库 = 1),
        拆卸=SUM(td.数量),
        末存=SUM(-td.数量)
    FROM tdb td,tdbm tm
    WHERE tm.日期>=@dt1 AND tm.日期<DATEADD(Day,1,@dt2) And tm.单号 = td.单号 And td.拆卸入库 = 1
    GROUP BY tm.日期,td.物料,td.供应商,td.供应商型号,td.仓库
    )e ON a.物料=e.物料 And a.供应商 = e.供应商 And a.供应商型号 = e.供应商型号 And a.仓库 = e.仓库
    ORDER BY 物料,供应商,供应商型号
      

  5.   

    还是不正确----相同日期的统计有重复项!
    初结应等于上一日期的结存.
    结存应等于: 本次初存 + 入库 – 发料 + 退料 – 退货 – 报废 + 调入 – 调出 + 拆卸
    所有结果应像下面:
    2005-01-08 S02 S0021 d01 50 40 0 0 0 0 0 0 0 90
    2005-03-08 S02 S0021 d01 90 0 25 0 25 0 0 0 0 40
    2006-02-05 S02 S0021 d01 40 0 0 5 0 3 0 0 0 42
    2006-02-08 S02 S0021 d01 42 0 50 0 0 0 0 0 5 97
    2006-02-10 S02 S0021 d01 97 40 10 0 0 0 0 0 0 127
    2006-02-15 S02 S0021 d01 127 10 0 20 0 0 0 5 0 102