我现在有这样几张表:
 
1)入库表(产品名称,产品规格,产品批号,件数,总重量,仓库,入库方式)其中入库方式分生产收入和其它收入
2)出库表(产品名称,产品规格,产品批号,件数,总重量,仓库,出库方式)其中出库方式分公路销售和铁路销售
3)盘点表(盘点日期,产品名称.产品规格,产品批号,件数,上期末数量,仓库)问能否由这个三个表生成一种类似于下面结构的盘点单
产品名称,产品规格,产品批号,上期末的库存,生产收入,其它收入,公路销售,铁路销售,期末库存其中期末库存=上期末的库存+生产收入+其它收入-公路销售-铁路销售再把此次结算的期末库存写入到上面的3)盘点表里.sql语句应该怎么写?谢谢,感动中!!!!

解决方案 »

  1.   

    实例--明细帐数据
    CREATE TABLE tb(
    ID int IDENTITY PRIMARY KEY,
    Item varchar(10),  --产品编号
    Quantity int,      --交易数量
    Flag bit,          --交易标志,1代表入库,0代表出库,这样可以有效区分退货(负数)
    Date datetime)     --交易日期
    INSERT tb SELECT 'aa',100,1,'2005-1-1'
    UNION ALL SELECT 'aa',90 ,1,'2005-2-1'
    UNION ALL SELECT 'aa',55 ,0,'2005-2-1'
    UNION ALL SELECT 'aa',-10,1,'2005-2-2'
    UNION ALL SELECT 'aa',-5 ,0,'2005-2-3'
    UNION ALL SELECT 'aa',200,1,'2005-2-2'
    UNION ALL SELECT 'aa',90 ,1,'2005-2-1'
    UNION ALL SELECT 'bb',95 ,1,'2005-2-2'
    UNION ALL SELECT 'bb',65 ,0,'2005-2-3'
    UNION ALL SELECT 'bb',-15,1,'2005-2-5'
    UNION ALL SELECT 'bb',-20,0,'2005-2-5'
    UNION ALL SELECT 'bb',100,1,'2005-2-7'
    UNION ALL SELECT 'cc',100,1,'2005-1-7'
    GO--查询时间段定义
    DECLARE @dt1 datetime,@dt2 datetime
    SELECT @dt1='2005-2-1',@dt2='2005-2-10'--查询
    --统计时间段内无发生额的数据(如果这个不是查询需要的,去掉这段查询)
    SELECT Item,
    Date=CONVERT(char(10),@dt1,120),
    Opening=SUM(CASE WHEN Flag=1 THEN Quantity ELSE -Quantity END),
    [IN]=0,
    [IN_Retrun]=0,
    [OUT]=0,
    [OUT_Return]=0,
    Balance=SUM(CASE WHEN Flag=1 THEN Quantity ELSE -Quantity END)
    FROM tb a
    WHERE Date<@dt1 AND NOT EXISTS(
    SELECT * FROM tb WHERE Item=a.Item AND Date>@dt1 AND Date<DATEADD(Day,1,@dt2))
    GROUP BY Item
    UNION ALL
    --指定时间段内有交易发生的数据
    SELECT Item,
    Date=CONVERT(char(10),Date,120),
    Opening=ISNULL((SELECT SUM(CASE WHEN Flag=1 THEN Quantity ELSE -Quantity END)
    FROM tb WHERE Item=a.Item AND Date<MIN(a.Date)),0),
    [IN]=ISNULL(SUM(CASE WHEN Flag=1 AND Quantity>0 THEN Quantity END),0),
    [IN_Retrun]=ISNULL(SUM(CASE WHEN Flag=1 AND Quantity<0 THEN -Quantity END),0),
    [OUT]=ISNULL(SUM(CASE WHEN Flag=0 AND Quantity>0 THEN Quantity END),0),
    [OUT_Return]=ISNULL(SUM(CASE WHEN Flag=0 AND Quantity<0 THEN -Quantity END),0),
    Balance=ISNULL((SELECT SUM(CASE WHEN Flag=1 THEN Quantity ELSE -Quantity END)
    FROM tb WHERE Item=a.Item AND Date<=MAX(a.Date)),0)
    FROM tb a
    WHERE Date>=@dt1 AND Date<DATEADD(Day,1,@dt2)
    GROUP BY CONVERT(char(10),Date,120),Item
    ORDER BY Item,Date
    /*--结果
    Item    Date       Opening    IN     IN_Retrun   OUT   OUT_Return   Balance 
    ---------- ---------------- -------------- ----------- ---------------- ----------- ------------------- ----------- 
    aa     2005-02-01   100      180     0           55      0            225
    aa     2005-02-02   225      200     10          0       0            415
    aa     2005-02-03   415      0       0           0       5            420
    bb     2005-02-02   0        95      0           0       0            95
    bb     2005-02-03   95       0       0           65      0            30
    bb     2005-02-05   30       0       15          0       20           35
    bb     2005-02-07   35       100     0           0       0            135
    cc     2005-02-01   100       0      0           0       0            100
    --*/
      

  2.   

    出库表
    CKID 出库日期 单据号 经办人 出库方式 收货单位 产品名称  包装规格  产品批号  件数 总重量(吨)
    CK-20091120-100 2009-11-20 51235 dd 槽车 兰州 高滴点麻芯脂 180Kg/件 20091104 528 95.04
    CK-20091119-100 2009-11-19 13131 dd 槽车 新疆 2号HP高温脂 170Kg/件 20091009 15  2.55入库表
    RKID 入库日期 单据号 经办人 入库方式 供货单位 产品名称 包装规格 产品批号 件数 总重量(吨)
    RK-20091110-100 2009-11-10 21141 aa 生产 新酸碱 钢丝绳表面脂 170Kg/件 20091110 5 0.85
    RK-20091114-100 2009-11-14 41414 bb 生产 十五号 10号航空液压油 20Kg/件 20091114 128 2盘点表
    盘点日期    产品名称     产品规格   产品批号   件数 上期末数量(吨)   仓库  
    2009-11-30 钢丝绳表面脂 170Kg/件  20091110   10     1.7        一区  问能否由这个三个表生成一种类似于下面结构的盘点单
    产品名称,产品规格,产品批号,上期末的库存,生产收入,其它收入,公路销售,铁路销售,期末库存其中期末库存=上期末的库存+生产收入+其它收入-公路销售-铁路销售再把此次结算的期末库存写入到上面的3)盘点表里.