;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.编码
漏了group by 编码, 名称
谢谢!“库存”中的数量为实际库存量 我将楼上的代码整理一下,但发现运行不了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.编码
看看这个合不合你的要求: 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.[出库明细]
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.编码
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.[出库明细]
[期初结存] = MAX(ISNULL(B.数量,0))
+ SUM(ISNULL([出库量_之后],0)) - MAX(ISNULL([入库量_之后],0))
+ SUM(ISNULL([出库量_当天],0)) - MAX(ISNULL([入库量_当天],0))
+ SUM(ISNULL([出库量_之前],0)) - MAX(ISNULL([入库量_之前],0)),