Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用先进先出理念,在每个月底进行库存平衡的SQL_Sql - Fatal编程技术网

使用先进先出理念,在每个月底进行库存平衡的SQL

使用先进先出理念,在每个月底进行库存平衡的SQL,sql,Sql,对于这些数据,我想写一个程序,它将在每个月底给出平衡库存。换句话说,我们可以说,我必须在每个月底找到运行平衡,而不是按照FIFO的概念逐月分组。这是桌子 create Table transactions ( [Date] Date, SECURITY_NAME VarChar(20), LOC VarChar(20), Investor VarChar(20), BUY_SELL VarChar(10), Quantity numeric(11, 2), TRANS_RATE numeric(

对于这些数据,我想写一个程序,它将在每个月底给出平衡库存。换句话说,我们可以说,我必须在每个月底找到运行平衡,而不是按照FIFO的概念逐月分组。这是桌子

create Table transactions ( [Date] Date, SECURITY_NAME VarChar(20), LOC VarChar(20), Investor VarChar(20), BUY_SELL VarChar(10), Quantity numeric(11, 2), TRANS_RATE numeric(11, 2), Inventory_value numeric(11,2) )

Insert into transactions values ('1-Jan-2014', 'HDFC', 'HO', 'OS', 'B', 125.00, 125.00, null) 
Insert into transactions values ('2-Jan-2014', 'ICICI', 'HO', 'OS', 'B', 150.00, 145.00, null) 
Insert into transactions values ('3-Jan-2014', 'Axis', 'HO', 'OS', 'B', 25.00, 150.00, null) 
Insert into transactions values ('4-Feb-2014', 'ICICI', 'HO', 'OS', 'B', 100.00, 150.00, null) 
Insert into transactions values ('5-Feb-2014', 'ICICI', 'HO', 'OS', 'S', 50.00, 185.00, null) 
Insert into transactions values ('6-Feb-2014', 'HDFC', 'HO', 'OS', 'S', 50.00, 125.00, null) 
Insert into transactions values ('1-Mar-2014', 'HDFC', 'HO', 'OS', 'B', 100.00, 125.00, null) 
Insert into transactions values ('2-Mar-2014', 'ICICI', 'HO', 'OS', 'S', 125.00, 145.00, null) 
Insert into transactions values ('3-Mar-2014', 'HDFC', 'HO', 'OS', 'S', 125.00, 150.00, null) 
Insert into transactions values ('4-Mar-2014', 'ICICI', 'HO', 'OS', 'B', 100.00, 175.00, null) 
Insert into transactions values ('6-Mar-2014', 'Axis', 'HO', 'OS', 'B', 125.00, 125.00, null) 
Insert into transactions values ('5-Apr-2014', 'Axis', 'HO', 'OS', 'S', 75.00, 185.00, null) 
Insert into transactions values ('6-Apr-2014', 'ICICI', 'HO', 'OS', 'S', 50.00, 125.00, null) 
Insert into transactions values ('6-Apr-2014', 'HDFC', 'HO', 'OS', 'B', 25.00, 125.00, null) 
update transactions set Inventory_value=(quantity*trans_rate)
我正试图获得这样的输出,即在每个月底仅使用FIFO进行数量平衡

Month   SECURITY_NAME   LOC     Investor    Balance_Qty     Inventry_value 
Jan     HDFC            HO      OS          125             15625 
Jan     ICICI           HO      OS          150             21750 
Jan     Axis            HO      OS          25              3750 
Feb     ICICI           HO      OS          200             29500 
Feb     HDFC            HO      OS          75              9375 
Feb     Axis            HO      OS          25              3750 
Mar     HDFC            HO      OS          50              7500 
Mar     ICICI           HO      OS          175             23750 
Mar     Axis            HO      OS          150             19375 
Apr     Axis            HO      OS          75              9375 
Apr     ICICI           HO      OS          125             21250 
Apr     HDFC            HO      OS          75              10625

Inventory_value=(quantity*trans_rate)

我已经在查询中编写了逻辑

CREATE TABLE #NEWTABLE([Month] VARCHAR(20),   SECURITY_NAME VARCHAR(50),   LOC VARCHAR(50),     Investor VARCHAR(50),    Balance_Qty INT,     Inventry_value NUMERIC(18,2))

DECLARE @RNO INT
DECLARE @DATE DATE
DECLARE @SECURITYNAME VARCHAR(50)
DECLARE @LOC VARCHAR(50)
DECLARE @INVESTOR VARCHAR(50)
DECLARE @BUYSELL CHAR
DECLARE @QUANTITY INT
DECLARE @PREV_MONTH_QUANTITY INT
DECLARE @SELL_QUANTITY INT

DECLARE @BAL_QUANTITY INT
DECLARE @RNO_MONTHDATES INT
DECLARE @LASTINMONTH INT

DECLARE @FIRSTMONTH DATE
DECLARE @PREV_MONTH DATE

SELECT @FIRSTMONTH = MIN([DATE]) FROM transactions


DECLARE rollCursor CURSOR FOR 
SELECT *,
MAX(RNO_MONTHDATES) OVER(PARTITION BY DATEPART(MONTH,[DATE]))MAXX 
FROM
(
    select [DATE],SECURITY_NAME,LOC,INVESTOR,BUY_SELL,QUANTITY,
    ROW_NUMBER() OVER(PARTITION BY DATEPART(MONTH,[DATE]),SECURITY_NAME ORDER BY DATEPART(MONTH,[DATE]), SECURITY_NAME,BUY_SELL) RNO 
    ,ROW_NUMBER() OVER(PARTITION BY DATEPART(MONTH,[DATE]) ORDER BY DATEPART(MONTH,[DATE]), (SELECT(0))) RNO_MONTHDATES
    from transactions
)TAB
ORDER BY DATEPART(MONTH,[DATE]), SECURITY_NAME,BUY_SELL,RNO_MONTHDATES

OPEN rollCursor

-- Loop starts from here 
FETCH NEXT FROM rollCursor
INTO @DATE,@SECURITYNAME,@LOC,@INVESTOR,@BUYSELL,@QUANTITY,@RNO,@RNO_MONTHDATES,@LASTINMONTH

WHILE @@FETCH_STATUS = 0
BEGIN

     -- First month's records will be inserted directly
     IF(DATEPART(MONTH,@DATE) = DATEPART(MONTH,@FIRSTMONTH))
     BEGIN
            INSERT INTO #NEWTABLE
            SELECT @DATE,@SECURITYNAME,@LOC,@INVESTOR,@QUANTITY,NULL
     END

     ELSE IF(DATEPART(MONTH,@DATE) <> DATEPART(MONTH,@FIRSTMONTH))
     BEGIN

        -- If Buy is the 1st record for a SECURITYNAME then it will not take SELL because its  already included inside the below the query
        IF(@RNO = 1)
        BEGIN

            IF(@BUYSELL = 'S')
            BEGIN
                SET @QUANTITY = 0
            END

            SET @PREV_MONTH_QUANTITY=0
            SET @SELL_QUANTITY=0

            -- Finds previous month quantity
            SELECT  @PREV_MONTH_QUANTITY = ISNULL(Balance_Qty,0)
            FROM #NEWTABLE 
            WHERE SECURITY_NAME = @SECURITYNAME
            AND DATEPART(MONTH,[MONTH]) = 
            (SELECT MAX(DATEPART(MONTH,[MONTH])) FROM #NEWTABLE WHERE DATEPART(MONTH,[MONTH]) < DATEPART(MONTH,CAST(@DATE AS DATE)))

            -- Find current month's Sell Quantity of current SECURITYNAME 
            SELECT @SELL_QUANTITY  = ISNULL(Quantity,0) FROM transactions 
            WHERE SECURITY_NAME = @SECURITYNAME AND BUY_SELL = 'S' AND DATEPART(MONTH,@DATE) = DATEPART(MONTH,[DATE])

            INSERT INTO #NEWTABLE
            SELECT @DATE,@SECURITYNAME,@LOC,@INVESTOR,(@PREV_MONTH_QUANTITY+@QUANTITY)-@SELL_QUANTITY,NULL

        END     

        -- If it is last record in current month, it finds out the missing SECURITYNAME in current month, take from previous month and add as current month
        IF(@RNO_MONTHDATES = @LASTINMONTH)
        BEGIN

            INSERT INTO #NEWTABLE
            SELECT CAST(CAST(YEAR([MONTH]) AS VARCHAR(4))+'-'+CAST(MONTH(@DATE) AS VARCHAR(14))+'-01' AS DATE),
            SECURITY_NAME,LOC,INVESTOR,BALANCE_QTY,INVENTRY_VALUE 
            FROM #NEWTABLE
            WHERE SECURITY_NAME IN
            (
                SELECT SECURITY_NAME 
                FROM #NEWTABLE 
                WHERE DATEPART(MONTH,[MONTH]) = 
                (SELECT MAX(DATEPART(MONTH,[MONTH])) FROM #NEWTABLE WHERE DATEPART(MONTH,[MONTH]) < DATEPART(MONTH,@DATE))         
                EXCEPT
                SELECT SECURITY_NAME 
                FROM #NEWTABLE 
                WHERE DATEPART(MONTH,[MONTH]) = DATEPART(MONTH,@DATE)
            )
            AND DATEPART(MONTH,[MONTH]) = 
            (SELECT MAX(DATEPART(MONTH,[MONTH])) FROM #NEWTABLE WHERE DATEPART(MONTH,[MONTH]) < DATEPART(MONTH,@DATE))         

        END

     END

    FETCH NEXT FROM rollCursor
    INTO @DATE,@SECURITYNAME,@LOC,@INVESTOR,@BUYSELL,@QUANTITY,@RNO,@RNO_MONTHDATES,@LASTINMONTH
END 

CLOSE rollCursor;
DEALLOCATE rollCursor;


SELECT CAST(DATENAME(MONTH,[Month])AS VARCHAR(3)), SECURITY_NAME,LOC,Investor,Balance_Qty,Inventry_value  
FROM #NEWTABLE
查看结果
请添加计算以查找新表的Inventry_值

你的文章需要一些编辑,你能提供一个sqlfiddle吗?你能分享你现在没有提供正确输出的查询吗?你是如何得到第四行的200个余额数量的@马尼什·库马尔Singh@SarathAvanavu2月底,ICICI售出50台。所以左边只有150+100-50=200。现在求解该pls150+100-50=200。100和150来自哪里@Manish Kumar Singhh在价值200之后,你是如何得到75分的?请编辑和更新有问题的精确计算,并说明清楚。我一定会帮你的@曼尼什·库马尔·辛格