zoukankan      html  css  js  c++  java
  • 库存明细帐处理示例.sql

    --明细帐数据
    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
    --*/
  • 相关阅读:
    【权值分块】bzoj1208 [HNOI2004]宠物收养所
    【权值分块】bzoj1588 [HNOI2002]营业额统计
    【权值分块】bzoj1503 [NOI2004]郁闷的出纳员
    【pb_ds】bzoj1056 [HAOI2008]排名系统 bzoj1862 [Zjoi2006]GameZ游戏排名系统
    【分块】【树状数组】bzoj3744 Gty的妹子序列
    【权值分块】bzoj3685 普通van Emde Boas树
    【权值分块】bzoj3224 Tyvj 1728 普通平衡树
    【搜索】数学组の问题
    【块状链表】AutSky_JadeK的块状链表模板+总结(STL版)
    【DFS】【最短路】【spfa】【BFS】洛谷P2296 NOIP2014提高组 day2 T2 寻找道路
  • 原文地址:https://www.cnblogs.com/shihao/p/2508631.html
Copyright © 2011-2022 走看看