SQL Server - 从同一View表中的其他字段创建一个字段值

时间:2015-04-14 03:07:08

标签: sql sql-server view

我需要你的帮助,我不确切地知道问题的名称。我希望从其他字段创建记录到同一视图中的一个字段。但是当我创建它时,值显示但来自同一记录。

我有1个表,有4个字段 有YEAR,PEOPLE,REMAINING,CF

这样的逻辑:

  1. IF people A in 2014 have remaining value 25 and CF values 0 THEN people A in 2015 will have CF values 6

  2. IF Remaining > 6 THEN CF Values only 6, IF Remaining between 0 to 6 THEN CF Values = Remaining, IF Remaining < 0 THEN CF Values 0

  3. IF values in Current Year will always take from Remaining in Last Year so if People A didn't have remaining in last year, the CF in current year become 0

  4. 这是我的代码:

    SELECT  
        A.FiscalYear,
        C.EmployeeName, 
        CASE 
            WHEN A.FiscalYear < 2015 THEN A.Remaining 
            WHEN B_1.daystaken < 0 THEN A.Remaining + ISNULL(B_1.DaysTaken, 0) 
            ELSE A.Entitlement 
        END AS Remaining,
        CASE 
            WHEN A.remaining > 6 THEN 6
            WHEN A.remaining BETWEEN 0 AND 6 THEN A.remaining
            WHEN A.remaining < 0 THEN 0
            ELSE ISNULL(A.remaining,0)
        END AS CF
    FROM  dbo.DataLeaveBalance AS A 
    LEFT OUTER JOIN dbo.VWLeave_takens AS B_1 
        ON A.FiscalYear = B_1.AffectFY 
        AND A.EmpCode = B_1.EmpCode 
    LEFT OUTER JOIN dbo.MasterEmployee AS C
        ON A.EmpCode = C.EmpCode
    
    This the result from my code:
    
    year        people  remain      cf
    ----------- ------- ----------- -----------
    2014        Jackson 14          6
    2014        Eva     5           5
    2014        Akson   0           0
    2015        Jackson 10          6
    2015        Eva     10          6
    2015        Akson   13          6
    
    I want the result like this:
    
    year        people  remain      cf
    ----------- ------- ----------- -----------
    2014        Jackson 14          0
    2014        Eva     5           0
    2014        Akson   0           0
    2015        Jackson 10          6
    2015        Eva     10          5
    2015        Akson   13          0
    2016        Jackson 10          6
    2016        Eva     10          6
    2016        Akson   13          6
    

2 个答案:

答案 0 :(得分:0)

您只有每行可用的当前年份的值。您的计算需要访问上一年的价值。

您可以使用FiscalYear-1

等连接获取上一年的值

现在,您可以在行级别上获得当前(B_1)及其之前的(B_2)年份,并且可以在计算中使用它。

SELECT  
    *
FROM  dbo.DataLeaveBalance AS A 
LEFT OUTER JOIN dbo.VWLeave_takens AS B_1 
    ON A.FiscalYear = B_1.AffectFY 
    AND A.EmpCode = B_1.EmpCode 
LEFT OUTER JOIN dbo.VWLeave_takens AS B_2
    ON (A.FiscalYear-1) = B_1.AffectFY 
    AND A.EmpCode = B_1.EmpCode 
LEFT OUTER JOIN dbo.MasterEmployee AS C
    ON A.EmpCode = C.EmpCode

答案 1 :(得分:0)

如果我没弄错,你需要使用CTE。

这样的事情:

;WITH CTE AS(
    SELECT  
    A.FiscalYear,
    C.EmployeeName, 
    CASE 
        WHEN A.FiscalYear < 2015 THEN A.Remaining 
        WHEN B_1.daystaken < 0 THEN A.Remaining + ISNULL(B_1.DaysTaken, 0) 
        ELSE A.Entitlement 
    END AS Remaining
    FROM  dbo.DataLeaveBalance AS A 
    LEFT OUTER JOIN dbo.VWLeave_takens AS B_1 
        ON A.FiscalYear = B_1.AffectFY 
        AND A.EmpCode = B_1.EmpCode 
    LEFT OUTER JOIN dbo.MasterEmployee AS C
        ON A.EmpCode = C.EmpCode
    )
SELECT *,   CASE 
                WHEN CTE.Remaining > 6 THEN 6
                WHEN CTE.Remaining BETWEEN 0 AND 6 THEN CTE.Remaining
                WHEN CTE.Remaining < 0 THEN 0
                ELSE ISNULL(CTE.Remaining,0)
            END AS CF
FROM CTE