动态时间段收发存报表

来源:互联网 发布:手绘板mac驱动 编辑:程序博客网 时间:2024/05/02 01:14

http://topic.csdn.net/u/20090831/10/a850c8a4-c733-459f-8d33-a9523e73ad52.html

 

--------------------------------------------------------------------------
--  Author : htl258(Tony)
--  Date   : 2009-08-31 11:00:29
--  Version:Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (Intel X86)
--          Mar 29 2009 10:27:29
--          Copyright (c) 1988-2008 Microsoft Corporation
--          Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)
--------------------------------------------------------------------------

 

 

--> 生成测试数据表:IO_STORE

 

If not object_id('[IO_STORE]') is null

    Drop table [IO_STORE]

Go

Create table [IO_STORE]([STORE] nvarchar(4),[BD] Datetime,[BC] nvarchar(10),[GOODS] nvarchar(6),[QT] int,[ISIND] int)

Insert [IO_STORE]

Select N'半成品仓','2009-07-01',N'090701001',N'16081D',300,1 union all

Select N'半成品仓','2009-07-02',N'090702003',N'16081D',50,1 union all

Select N'半成品仓','2009-07-18',N'090718003',N'16081D',90,1 union all

Select N'半成品仓','2009-07-18',N'090718004',N'16081D',200,1 union all

Select N'半成品仓','2009-07-01',N'090701002',N'16082A',50,1 union all

Select N'半成品仓','2009-07-15',N'090715007',N'16083K',80,1 union all

Select N'成品仓','2009-07-02',N'090702007',N'16081D',50,1 union all

Select N'成品仓','2009-07-03',N'090703008',N'16081D',77,1 union all

Select N'半成品仓','2009-07-05',N'090705001',N'16081D',30,0 union all

Select N'半成品仓','2009-07-06',N'090706002',N'16082A',20,0 union all

Select N'半成品仓','2009-07-18',N'090718006',N'16082A',20,0 union all

Select N'半成品仓','2009-07-23',N'090723007',N'16083K',35,0 union all

Select N'成品仓','2009-07-28',N'090728026',N'16081D',20,0

Go

--Select * from [IO_STORE]

 

-->SQL查询如下:

If not object_id('[R_I_INOUTSTOR]') is null

    Drop FUNCTION [R_I_INOUTSTOR]

Go

CREATE  FUNCTION R_I_INOUTSTOR(@FROMDATE DATETIME, @TODATE DATETIME)

RETURNS @TempTable TABLE

(

    ID int identity,

    STORE VARCHAR(80), --仓库

    BD DATETIME, --日期

    BC VARCHAR(80),--单号

    GOODSID VARCHAR(80) ,--货品

    SQT FLOAT , --期初

    IQT FLOAT , --收入

    OQT FLOAT ,--发出

    CQT FLOAT --结存

)

AS

BEGIN

    INSERT @TempTable

    SELECT STORE,@FROMDATE,'期初',GOODS,

        sum(case ISIND when 1 then QT else -QT end),0,0,

        sum(case ISIND when 1 then QT else -QT end)

    FROM [IO_STORE]

    WHERE  [BD]<@FROMDATE

    GROUP BY STORE,GOODS

 

    INSERT @TempTable

    SELECT STORE,BD,BC,GOODS,0,

        SUM(case ISIND WHEN 1 then QT else 0 end) IQT,

        SUM(case ISIND WHEN 0 then QT else 0 end) OQT,

        0

    FROM [IO_STORE]

    WHERE [BD] BETWEEN @FROMDATE AND @TODATE

    GROUP BY STORE,BD,BC,GOODS

   

    UPDATE t SET

    SQT=CASE WHEN SQT=0 THEN (SELECT SUM(CQT+IQT-OQT) from @TempTable where STORE=t.STORE AND GOODSID=t.GOODSID AND ID<=t.ID)

        ELSE SQT

        END-IQT+OQT

    FROM @TempTable t

   

    UPDATE @TempTable SET

        CQT=SQT+IQT-OQT

    WHERE CQT=0

 INSERT @TempTable

    SELECT STORE,

  (select top 1 BD from @TempTable where STORE=t.STORE AND GOODSID=t.GOODSID order by ID DESC),

  '结存',GOODSID,

        (select SQT from @TempTable where STORE=t.STORE AND GOODSID=t.GOODSID and BC='期初'),

  sum(IQT),sum(OQT),

        (select top 1 CQT from @TempTable where STORE=t.STORE AND GOODSID=t.GOODSID order by ID DESC)

    FROM @TempTable t

    WHERE  [BD] BETWEEN @FROMDATE AND @TODATE

    GROUP BY STORE,GOODSID

    RETURN

END

GO

--调用查询

 

SELECT STORE 仓库,CONVERT(VARCHAR(10),BD,23) 日期,BC 单号,

    GOODSID 货品,SQT 期初数,IQT 收入数,OQT 发出数,CQT 结存数

FROM R_I_INOUTSTOR('2009-07-03','2009-07-28')

ORDER BY STORE,GOODSID,ID

 

/*

仓库        日期        单号        货品        期初数  收入数  发出数  结存数

---------- ---------- ---------- ---------- ----- ----- ----- -----

半成品仓      2009-07-03 期初        16081D     350   0     0     350

半成品仓      2009-07-05 090705001    16081D     350   0     30    320

半成品仓      2009-07-18 090718003    16081D     320   90    0     410

半成品仓      2009-07-18 090718004    16081D     410   200   0     610

半成品仓      2009-07-18 结存        16081D     350   290   30    610

半成品仓      2009-07-03 期初        16082A     50    0     0     50

半成品仓      2009-07-06 090706002    16082A     50    0     20    30

半成品仓      2009-07-18 090718006    16082A     30    0     20    10

半成品仓      2009-07-18 结存        16082A     50    0     40    10

半成品仓      2009-07-15 090715007    16083K     0     80    0     80

半成品仓      2009-07-23 090723007    16083K     80    0     35    45

半成品仓      2009-07-23 结存        16083K     NULL  80    35    45

成品仓       2009-07-03 期初        16081D     50    0     0     50

成品仓       2009-07-03 090703008     16081D     50    77    0     127

成品仓       2009-07-28 090728026     16081D     127   0     20    107

成品仓       2009-07-28 结存        16081D     50    77    20    107

 

(16 行受影响)

 

*/

 

 

--增强版:http://topic.csdn.net/u/20100520/20/a3055dfd-838b-44d5-a37c-f2d26e1b226f.html?14076

----------------------------------------------------------------------------------
--
Author : htl258(Tony)
--
Date   : 2010-05-20 23:11:48
--
Version: Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)
--
          Jul  9 2008 14:43:34
--
          Copyright (c) 1988-2008 Microsoft Corporation
--
          Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)
--
Blog   : http://blog.csdn.net/htl258
--
--------------------------------------------------------------------------------

--> 生成测试数据表: [VI_INSTORE]
IF OBJECT_ID('[VI_INSTORE]') IS NOT NULL
   
DROP TABLE [VI_INSTORE]
GO
CREATE TABLE [VI_INSTORE] ([BILLID] [int],[STOREID] [nvarchar](10),[GOODSID] [nvarchar](10),[BILLDATE] [datetime],[BILLCODE] [nvarchar](10),[QTY] [int],[REMARK1] [nvarchar](10))
INSERT INTO [VI_INSTORE]
SELECT '1001','原材料仓','G001','2010-05-01','IN001','100','AB' UNION ALL
SELECT '1002','原材料仓','G002','2010-05-03','IN002','300','C' UNION ALL
SELECT '1003','原材料仓','G003','2010-05-03','IN003','200','D' UNION ALL
SELECT '1003','原材料仓','G003','2010-05-03','IN003','70','E' UNION ALL
SELECT '1004','原材料仓','G003','2010-05-30','IN009','40','F' UNION ALL
SELECT '1005','半成品仓','G004','2010-05-30','IN008','33','K'

--> 生成测试数据表: [VI_OUTSTORE]
IF OBJECT_ID('[VI_OUTSTORE]') IS NOT NULL
   
DROP TABLE [VI_OUTSTORE]
GO
CREATE TABLE [VI_OUTSTORE] ([BILLID] [int],[STOREID] [nvarchar](10),[GOODSID] [nvarchar](10),[BILLDATE] [datetime],[BILLCODE] [nvarchar](10),[QTY] [int],[REMARK1] [nvarchar](10))
INSERT INTO [VI_OUTSTORE]
SELECT '3001','原材料仓','G001','2010-05-02','OU001','30',null UNION ALL
SELECT '3002','原材料仓','G003','2010-05-05','OU002','100',null UNION ALL
SELECT '3003','半成品仓','G004','2010-05-30','OU003','30',null

--SELECT * FROM [VI_INSTORE]
--
SELECT * FROM [VI_OUTSTORE]

-->SQL查询如下:
If not object_id('[VINSTORE]') is null
   
Drop FUNCTION VINSTORE
Go
CREATE  FUNCTION VINSTORE(@FROMDATE DATETIME, @TODATE DATETIME)
RETURNS @TempTable TABLE
(
    ID
int identity,
    STOREID
VARCHAR(80), --仓库
    [BILLDATE] VARCHAR(10), --日期
    [BILLCODE] VARCHAR(80),--单号
    REMARK1 VARCHAR(100),--备注
    GOODSID VARCHAR(80) ,--货品
    SQT FLOAT , --期初
    IQT FLOAT , --收入
    OQT FLOAT ,--发出
    CQT FLOAT --结存
)
AS
BEGIN
   
INSERT @TempTable
   
SELECT [STOREID],CONVERT(CHAR,@FROMDATE,23),'期初',MAX([REMARK1]),[GOODSID],
       
sum(case ISIND when 1 then [QTY] else -[QTY] end),0,0,
       
sum(case ISIND when 1 then [QTY] else -[QTY] end)
   
FROM (
       
SELECT ISIND=1,* FROM VI_INSTORE
       
UNION ALL
       
SELECT IDIND=0,* FROM [VI_OUTSTORE]
        )
[IO_STORE]
   
WHERE  [BILLDATE]<@FROMDATE
   
GROUP BY [STOREID],[GOODSID]
   
INSERT @TempTable
   
SELECT [STOREID],CONVERT(CHAR,@FROMDATE,23),'期初','',[GOODSID],0,0,0,0
   
FROM (
       
SELECT ISIND=1,* FROM VI_INSTORE
       
UNION ALL
       
SELECT IDIND=0,* FROM [VI_OUTSTORE]
        )
[IO_STORE]
   
WHERE NOT EXISTS(SELECT 1 FROM @TempTable WHERE STOREID=[IO_STORE].STOREID AND GOODSID=[IO_STORE].GOODSID)
   
GROUP BY [STOREID],[GOODSID]
   
   
INSERT @TempTable
   
SELECT [STOREID],CONVERT(CHAR,[BILLDATE],23),[BILLCODE],MAX([REMARK1]),[GOODSID],0,
       
SUM(case ISIND WHEN 1 then [QTY] else 0 end) IQT,
       
SUM(case ISIND WHEN 0 then [QTY] else 0 end) OQT,
       
0
   
FROM (
       
SELECT ISIND=1,* FROM VI_INSTORE
       
UNION ALL
       
SELECT IDIND=0,* FROM [VI_OUTSTORE]
        )
[IO_STORE]
   
WHERE [BILLDATE] BETWEEN @FROMDATE AND @TODATE
   
GROUP BY [STOREID],[BILLDATE],[BILLCODE],[GOODSID] 

   
UPDATE t SET
        SQT
=CASE WHEN SQT=0 THEN (SELECT SUM(CQT+IQT-OQT) from @TempTable where [STOREID]=t.[STOREID] AND GOODSID=t.GOODSID AND ID<=t.ID)
               
ELSE SQT
           
END-IQT+OQT
   
FROM @TempTable t   

   
UPDATE @TempTable SET
        CQT
=SQT+IQT-OQT
   
WHERE CQT=0

INSERT @TempTable
   
SELECT [STOREID],
          (
SELECT TOP 1 CONVERT(CHAR,[BILLDATE],23) FROM @TEMPTABLE WHERE [STOREID]=T.[STOREID] AND GOODSID=T.GOODSID ORDER BY ID DESC),
         
'结存','',GOODSID,(SELECT SQT FROM @TEMPTABLE WHERE [STOREID]=T.[STOREID] AND GOODSID=T.GOODSID AND [BILLCODE]='期初'),
         
SUM(IQT),SUM(OQT),(SELECT TOP 1 CQT FROM @TEMPTABLE WHERE [STOREID]=T.[STOREID] AND GOODSID=T.GOODSID ORDER BY ID DESC)
   
FROM @TempTable t
   
WHERE  [BILLDATE] BETWEEN @FROMDATE AND @TODATE
   
GROUP BY [STOREID],GOODSID
   
RETURN
END
GO

--调用查询


SELECT STOREID 仓库,BILLDATE 日期,BILLCODE 单号,REMARK1 备注,
    GOODSID 货品,SQT 期初数,IQT 收入数,OQT 发出数,CQT 结存数
FROM VINSTORE('2010-05-01','2010-05-31')
ORDER BY GOODSID,STOREID,ID
/*
仓库    日期    单号    备注    货品    期初数    收入数    发出数    结存数
原材料仓    2010-05-01    期初        G001    0    0    0    0
原材料仓    2010-05-01    IN001    AB    G001    0    100    0    100
原材料仓    2010-05-02    OU001    NULL    G001    100    0    30    70
原材料仓    2010-05-02    结存        G001    0    100    30    70
原材料仓    2010-05-01    期初        G002    0    0    0    0
原材料仓    2010-05-03    IN002    C    G002    0    300    0    300
原材料仓    2010-05-03    结存        G002    0    300    0    300
原材料仓    2010-05-01    期初        G003    0    0    0    0
原材料仓    2010-05-03    IN003    E    G003    0    270    0    270
原材料仓    2010-05-05    OU002    NULL    G003    270    0    100    170
原材料仓    2010-05-30    IN009    F    G003    170    40    0    210
原材料仓    2010-05-30    结存        G003    0    310    100    210
半成品仓    2010-05-01    期初        G004    0    0    0    0
半成品仓    2010-05-30    IN008    K    G004    0    33    0    33
半成品仓    2010-05-30    OU003    NULL    G004    33    0    30    3
半成品仓    2010-05-30    结存        G004    0    33    30    3
*/

SELECT STOREID 仓库,BILLDATE 日期,BILLCODE 单号,REMARK1 备注,
    GOODSID 货品,SQT 期初数,IQT 收入数,OQT 发出数,CQT 结存数
FROM VINSTORE('2010-05-03','2010-05-31')
ORDER BY GOODSID,STOREID,ID
/*
仓库    日期    单号    备注    货品    期初数    收入数    发出数    结存数
原材料仓    2010-05-03    期初    AB    G001    70    0    0    70
原材料仓    2010-05-03    结存        G001    70    0    0    70
原材料仓    2010-05-03    期初        G002    0    0    0    0
原材料仓    2010-05-03    IN002    C    G002    0    300    0    300
原材料仓    2010-05-03    结存        G002    0    300    0    300
原材料仓    2010-05-03    期初        G003    0    0    0    0
原材料仓    2010-05-03    IN003    E    G003    0    270    0    270
原材料仓    2010-05-05    OU002    NULL    G003    270    0    100    170
原材料仓    2010-05-30    IN009    F    G003    170    40    0    210
原材料仓    2010-05-30    结存        G003    0    310    100    210
半成品仓    2010-05-03    期初        G004    0    0    0    0
半成品仓    2010-05-30    IN008    K    G004    0    33    0    33
半成品仓    2010-05-30    OU003    NULL    G004    33    0    30    3
半成品仓    2010-05-30    结存        G004    0    33    30    3
*/
SELECT STOREID 仓库,BILLDATE 日期,BILLCODE 单号,REMARK1 备注,
    GOODSID 货品,SQT 期初数,IQT 收入数,OQT 发出数,CQT 结存数
FROM VINSTORE('2010-06-01','2010-06-30')
ORDER BY GOODSID,STOREID,ID
/*
仓库    日期    单号    备注    货品    期初数    收入数    发出数    结存数
原材料仓    2010-06-01    期初    AB    G001    70    0    0    70
原材料仓    2010-06-01    结存        G001    70    0    0    70
原材料仓    2010-06-01    期初    C    G002    300    0    0    300
原材料仓    2010-06-01    结存        G002    300    0    0    300
原材料仓    2010-06-01    期初    F    G003    210    0    0    210
原材料仓    2010-06-01    结存        G003    210    0    0    210
半成品仓    2010-06-01    期初    K    G004    3    0    0    3
半成品仓    2010-06-01    结存        G004    3    0    0    3
*/
 

 

 

原创粉丝点击