簡體   English   中英

SQL Server-從同一視圖表中的其他字段創建值一個字段

[英]SQL Server - create value one field from other field in same View table

我需要您的幫助,我不知道確切的名字。 我想將記錄從另一個字段創建到同一視圖的一個字段中。 但是當我創建它時,值顯示卻來自同一條記錄。

我有4個字段的1個表,分別是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

這是我的代碼:

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

每行中只有當前年份的值。 您的計算需要使用上一年的值。

您可以通過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

如果我沒記錯的話,您需要使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM