本帖最后由 redstar66 于 2012-12-21 15:02:06 编辑

解决方案 »

  1.   

    ;with aa
    as(
    select 编码, 数量 , 库房 from 入库明细 uion
    select 编码, 数量 * (-1) as 数量 , 库房 from 出库明细)select 库存.编码 , 库存.名称 , sum(case when aa.数量>0 then aa.数量 else 0 end) as 入库量,
    sum(case when aa.数量<0 then aa.数量 else 0 end) as 出库量 , sum(库存.数量) + sum(aa.数量) as 库存量 from 库存 join aa on 库存.仓库 = aa.库房 and 仓库.编码 = aa.编码   
      

  2.   

    漏了group by 编码, 名称
      

  3.   

    谢谢!“库存”中的数量为实际库存量 我将楼上的代码整理一下,但发现运行不了select 库存.编码 , 库存.名称 , sum(case when aa.数量>0 then aa.数量 else 0 end) as 入库量,sum(case when aa.数量<0 then aa.数量 else 0 end) as 出库量 , sum(库存.数量) + sum(aa.数量) as 库存量 from 库存 join  (select 编码, 数量 , 库房 from 入库明细 uion select 编码, 数量 * (-1) as 数量 , 库房 from 出库明细) aa on 库存.仓库 = aa.库房 and 仓库.编码 = aa.编码   
      

  4.   

    看看这个合不合你的要求:
    USE tempdb
    GOCREATE TABLE dbo.[目录]
    (
    [编码] VARCHAR(20),
    [名称] NVARCHAR(20)
    )
    INSERT INTO dbo.[目录]
    SELECT '002',N'用户盒' UNION ALL
    SELECT '003',N'膨胀螺丝' UNION ALL
    SELECT '004',N'连接线' UNION ALL
    SELECT '006',N'-7线 ' UNION ALL
    SELECT '007',N'放大器'
    GOCREATE TABLE dbo.[库存]
    (
    [编码] VARCHAR(20),
    [名称] NVARCHAR(20),
    [数量] DECIMAL(10,2),
    [库房]  NVARCHAR(20)
    )
    INSERT INTO dbo.[库存]
    SELECT '002',N'用户盒',1210,N'仓库1' UNION ALL
    SELECT '004',N'连接线',1088,N'仓库1' UNION ALL
    SELECT '003',N'膨胀螺丝',1100,N'仓库1' UNION ALL
    SELECT '006',N'-7线',10001,N'仓库1' UNION ALL
    SELECT '003',N'膨胀螺丝',1200,N'仓库2'
    GO
    CREATE TABLE dbo.[入库单]
    (
    入库编号 VARCHAR(20),
    供应商 NVARCHAR(20),
    库房 NVARCHAR(20),
    操作员 NVARCHAR(20),
    入库日期 DATETIME
    )
    INSERT INTO dbo.[入库单]
    SELECT '00000001',N'四川广电网络',N'仓库1',N'系统管理员','2012-12-18' UNION ALL   
    SELECT '00000002',N'四川广电网络',N'仓库1',N'系统管理员','2012-12-18' UNION ALL
    SELECT '00000003',N'南充广电网络',N'仓库1',N'系统管理员','2012-12-18'
    GO
                      
    CREATE TABLE dbo.[入库明细]
    (
    入库编号 VARCHAR(20),
    编码 VARCHAR(20),
    名称 NVARCHAR(20),
    数量 DECIMAL(10,2),
    库房 NVARCHAR(20)
    )                  
    INSERT INTO dbo.[入库明细]
    SELECT '00000001','002',N'用户盒',1000,N'仓库1' UNION ALL
    SELECT '00000001','003',N'膨胀螺丝',1000,N'仓库1' UNION ALL
    SELECT '00000001','004',N'连接线',1000,N'仓库1' UNION ALL
    SELECT '00000002','002',N'用户盒',100,N'仓库1' UNION ALL
    SELECT '00000002','003',N'膨胀螺丝',100,N'仓库1' UNION ALL
    SELECT '00000003','002',N'用户盒',1,N'仓库1' UNION ALL
    SELECT '00000003','006',N'-7线',1,N'仓库1' UNION ALL
    SELECT '00000001','006',N'-7线',10000,N'仓库1'  
    GO            CREATE TABLE dbo.[出库单]
    (
    出库编号 NVARCHAR(20),
    库房 NVARCHAR(20),
    施工班组 NVARCHAR(20),
    出库日期 DATETIME  
    )
    INSERT INTO dbo.[出库单]
    SELECT N'00000001',N'仓库1',N'施工二组','2012-12-18' UNION ALL
    SELECT N'00000002',N'仓库1',N'施工二组','2012-12-18' UNION ALL
    SELECT N'00000003',N'仓库1',N'施工二组','2012-12-18' UNION ALL
    SELECT N'00000004',N'仓库1',N'施工三组','2012-12-18' UNION ALL
    SELECT N'00000005',N'仓库1',N'施工二组','2012-12-20' UNION ALL
    SELECT N'00000006',N'仓库1',N'施工二组','2012-12-20' UNION ALL
    SELECT N'00000007',N'仓库1',N'施工二组','2012-12-20' 
    GOCREATE TABLE dbo.[出库明细] 
    (
    出库编号 NVARCHAR(20),
    编码 NVARCHAR(20),
    名称 NVARCHAR(20),
    数量 DECIMAL(10,2),
    库房 NVARCHAR(20) 

    INSERT INTO dbo.[出库明细]
    SELECT N'00000001',N'002',N'用户盒',2,N'仓库1' UNION ALL  
    SELECT N'00000001',N'004',N'连接线',3,N'仓库1' UNION ALL
    SELECT N'00000001',N'004',N'连接线',3,N'仓库1' UNION ALL
    SELECT N'00000002',N'004',N'连接线',1,N'仓库1' UNION ALL
    SELECT N'00000002',N'002',N'用户盒',2,N'仓库1' UNION ALL
    SELECT N'00000003',N'002',N'用户盒',1,N'仓库1' UNION ALL
    SELECT N'00000005',N'004',N'连接线',1,N'仓库1' UNION ALL
    SELECT N'00000006',N'004',N'连接线',1,N'仓库1' UNION ALL
    SELECT N'00000007',N'002',N'用户盒',1,N'仓库1' UNION ALL
    SELECT N'00000004',N'002',N'用户盒',9,N'仓库1' UNION ALL
    SELECT N'00000004',N'004',N'连接线',8,N'仓库1'
    GO--SELECT * FROM dbo.[目录]
    --SELECT * FROM dbo.[库存]
    --SELECT * FROM dbo.[入库单]
    --SELECT * FROM dbo.[入库明细]
    --SELECT * FROM dbo.[出库单]
    --SELECT * FROM dbo.[出库明细] DECLARE @dt DATETIME
    SET @dt = '2012-12-20'SELECT
    A.编码,
    A.名称,
    库房 = ISNULL(B.库房,''),
    [入库量_之前] = MAX(ISNULL([入库量_之前],0)),
    [入库量_当天] = MAX(ISNULL([入库量_当天],0)),
    [入库量_之后] = MAX(ISNULL([入库量_之后],0)),
    [出库量_之前] = SUM(ISNULL([出库量_之前],0)),
    [出库量_当天] = SUM(ISNULL([出库量_当天],0)),
    [出库量_之后] = SUM(ISNULL([出库量_之后],0)),
    [之前库存量] = MAX(ISNULL(B.数量,0)) 
    + SUM(ISNULL([出库量_之后],0)) - MAX(ISNULL([入库量_之后],0)) 
    + SUM(ISNULL([出库量_当天],0)) - MAX(ISNULL([入库量_当天],0)),
    [当天库存量] = MAX(ISNULL(B.数量,0)) + SUM(ISNULL([出库量_之后],0)) - MAX(ISNULL([入库量_之后],0)),
    [当前库存量] = MAX(ISNULL(B.数量,0))

    FROM
    dbo.目录 AS A
    LEFT JOIN dbo.库存 AS B ON B.编码 = A.编码
    LEFT JOIN
    (
    SELECT 
    编码,
    库房,
    [入库量_之前] = (CASE bFlag WHEN -1 THEN SUM(ISNULL(数量,0)) ELSE 0 END),
    [入库量_当天] = (CASE bFlag WHEN 0 THEN SUM(ISNULL(数量,0)) ELSE 0 END),
    [入库量_之后] = (CASE bFlag WHEN 1 THEN SUM(ISNULL(数量,0)) ELSE 0 END)
    FROM
    (
    SELECT 
    bFlag = (CASE WHEN 入库日期<@dt THEN -1 WHEN 入库日期=@dt THEN 0 ELSE 1 END),
    编码,
    dbo.入库明细.库房,
    数量
    FROM
    dbo.入库明细
    INNER JOIN dbo.入库单 ON dbo.入库单.入库编号 = dbo.入库明细.入库编号
    ) C_
    GROUP BY
    编码,
    库房,
    bFlag
    )AS C ON C.编码 = A.编码 AND C.库房 = B.库房
    LEFT JOIN
    (
    SELECT 
    编码,
    库房,
    [出库量_之前] = (CASE bFlag WHEN -1 THEN SUM(ISNULL(数量,0)) ELSE 0 END),
    [出库量_当天] = (CASE bFlag WHEN 0 THEN SUM(ISNULL(数量,0)) ELSE 0 END),
    [出库量_之后] = (CASE bFlag WHEN 1 THEN SUM(ISNULL(数量,0)) ELSE 0 END)
    FROM
    (
    SELECT 
    bFlag = (CASE WHEN 出库日期<@dt THEN -1 WHEN 出库日期=@dt THEN 0 ELSE 1 END),
    编码,
    dbo.出库明细.库房,
    数量
    FROM
    dbo.出库明细 
    INNER JOIN dbo.出库单 ON dbo.出库单.出库编号 = dbo.出库明细.出库编号
    ) D_
    GROUP BY
    编码,
    库房,
    bFlag
    )AS D ON D.编码 = A.编码 AND D.库房 = B.库房
    GROUP BY
    A.编码,
    A.名称,
    B.库房
    ORDER BY
    A.编码,
    B.库房

    IF OBJECT_ID(N'dbo.[目录]') IS NOT NULL
    DROP TABLE dbo.[目录]                
    IF OBJECT_ID(N'dbo.[库存]') IS NOT NULL
    DROP TABLE dbo.[库存]
    IF OBJECT_ID(N'dbo.[入库单]') IS NOT NULL
    DROP TABLE dbo.[入库单]
    IF OBJECT_ID(N'dbo.[入库明细]') IS NOT NULL
    DROP TABLE dbo.[入库明细]
    IF OBJECT_ID(N'dbo.[出库单]') IS NOT NULL
    DROP TABLE dbo.[出库单]
    IF OBJECT_ID(N'dbo.[出库明细]') IS NOT NULL
    DROP TABLE dbo.[出库明细] 
         
      

  5.   

    在“[之前库存量] = ...”之前再加上一句:
    [期初结存] = MAX(ISNULL(B.数量,0)) 
    + SUM(ISNULL([出库量_之后],0)) - MAX(ISNULL([入库量_之后],0)) 
    + SUM(ISNULL([出库量_当天],0)) - MAX(ISNULL([入库量_当天],0))
    + SUM(ISNULL([出库量_之前],0)) - MAX(ISNULL([入库量_之前],0)),