22,207
社区成员
发帖
与我相关
我的任务
分享
--查询时间段定义
DECLARE @dt1 smalldatetime,@dt2 smalldatetime
SELECT @dt1='2005-1-1',@dt2='2005-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(b.[入库],0),
发料=ISNULL(b.[发料],0),
退料=ISNULL(b.[退料],0),
退货=ISNULL(b.[退货],0),
报废=ISNULL(b.[报废],0),
结存=ISNULL(a.结存,0)+ISNULL(b.初存,0)+ISNULL(b.末存,0)
FROM(SELECT 物料,供应商,供应商型号,仓库,结存 FROM Stocks)a --期初数
FULL JOIN(
SELECT
a.物料,
c.日期,
a.供应商,
a.供应商型号,
c.仓库,
初存=(SELECT SUM(CASE WHEN Flag=0 OR Flag=2 THEN tb.数量 ELSE -tb.数量 END)
FROM tb,tbm WHERE tbm.日期>=@dt AND tbm.日期<MIN(c.日期) AND tb.单号 = tbm.单号 AND tb.物料=a.物料 And tb.供应商 = a.供应商 And tb.供应商型号 = a.供应商型号),
入库=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 a,tbm c
WHERE c.日期>=@dt1 AND c.日期<DATEADD(Day,1,@dt2) And c.单号 = a.单号
GROUP BY c.日期,物料,供应商,供应商型号,c.仓库
)b ON a.物料=b.物料 And a.供应商 = b.供应商 And a.供应商型号 = b.供应商型号
ORDER BY 物料,供应商,供应商型号
USE CIMS_Debug
GO
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'MaterialBase')
DROP Table MaterialBase
GO
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'Stocks')
DROP Table Stocks
GO
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'tbm')
DROP Table tbm
GO
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'tb')
DROP Table tb
GO
CREATE TABLE MaterialBase(物料 varchar(10),描述 varchar(255))
INSERT MaterialBase SELECT 'aa','Test'
UNION ALL SELECT 'bb','0805,10K,+/-5%'
UNION ALL SELECT 'cc',NULL
CREATE TABLE Stocks(物料 varchar(10),供应商 varchar(15),供应商型号 varchar(50),仓库 varchar(10),结存 int)
INSERT Stocks SELECT 'aa','S01','S001','d01',100
INSERT Stocks SELECT 'aa','S01','S001','d02',50
UNION ALL SELECT 'bb','S02','S0021','d01',80
UNION ALL SELECT 'cc','S02','S0021','d01',50
--明细账数据
CREATE TABLE tbm(单号 varchar(15)PRIMARY KEY,仓库 varchar(10),日期 datetime)
INSERT tbm SELECT 'D01','d01','2005-1-1'
UNION ALL SELECT 'D02','d02','2005-2-2'
UNION ALL SELECT 'D03','d01','2005-2-7'
UNION ALL SELECT 'D04','d01','2005-1-8'
UNION ALL SELECT 'D05','d01','2005-3-8'
UNION ALL SELECT 'D06','d01','2005-2-5'
--明细账数据
CREATE TABLE tb(
ID int IDENTITY PRIMARY KEY,
单号 varchar(15), --单号
物料 varchar(10), --产品编号
供应商 varchar(15),
供应商型号 varchar(50),
数量 int, --交易数量
Flag tinyint) --交易标志,0代表入库,1代表发料,2代表退料,3代表退货,4代表报废,这样可以有效区分退货(-)
INSERT tb SELECT 'D01','aa','S01','S001',50,0
UNION ALL SELECT 'D01','aa','S01','S001',90,0
UNION ALL SELECT 'D01','aa','S01','S001',55 ,1
UNION ALL SELECT 'D02','aa','S01','S001',10,2
UNION ALL SELECT 'D02','aa','S01','S001',5 ,4
UNION ALL SELECT 'D02','aa','S01','S001',200,0
UNION ALL SELECT 'D02','aa','S01','S001',90 ,3
UNION ALL SELECT 'D02','bb','S02','S0021',95 ,0
UNION ALL SELECT 'D03','bb','S02','S0021',65 ,1
UNION ALL SELECT 'D03','bb','S02','S0021',15,0
UNION ALL SELECT 'D03','bb','S02','S0021',20,3
UNION ALL SELECT 'D03','bb','S02','S0021',10,0
UNION ALL SELECT 'D04','cc','S02','S0021',40,0
UNION ALL SELECT 'D05','cc','S02','S0021',25,1
UNION ALL SELECT 'D05','cc','S02','S0021',25,3
UNION ALL SELECT 'D06','cc','S02','S0021',5,2
UNION ALL SELECT 'D06','cc','S02','S0021',3,4
--查询时间段定义
DECLARE @dt1 smalldatetime,@dt2 smalldatetime
SELECT @dt1='2005-1-1',@dt2='2005-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(b.[入库],0),
发料=ISNULL(b.[发料],0),
退料=ISNULL(b.[退料],0),
退货=ISNULL(b.[退货],0),
报废=ISNULL(b.[报废],0),
结存=ISNULL(a.结存,0)+ISNULL(b.初存,0)+ISNULL(b.末存,0)
FROM(SELECT 物料,供应商,供应商型号,仓库,结存 FROM Stocks)a --期初数
FULL JOIN(
SELECT
a.物料,
c.日期,
a.供应商,
a.供应商型号,
c.仓库,
初存=(SELECT SUM(CASE WHEN Flag=0 OR Flag=2 THEN tb.数量 ELSE -tb.数量 END)
FROM tb,tbm WHERE tbm.日期>=@dt AND tbm.日期<MIN(c.日期) AND tb.单号 = tbm.单号 AND tb.物料=a.物料 And tb.供应商 = a.供应商 And tb.供应商型号 = a.供应商型号),
入库=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 a,tbm c
WHERE c.日期>=@dt1 AND c.日期<DATEADD(Day,1,@dt2) And c.单号 = a.单号
GROUP BY c.日期,物料,供应商,供应商型号,c.仓库
)b ON a.物料=b.物料 And a.供应商 = b.供应商 And a.供应商型号 = b.供应商型号
ORDER BY 物料,供应商,供应商型号
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'MaterialBase')
DROP Table MaterialBase
GO
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'Stocks')
DROP Table Stocks
GO
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'tbm')
DROP Table tbm
GO
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'tb')
DROP Table tb
GO