2017-03-03 203 views
-1

我的表,如下所示:SQL查詢來計算工資,直到特定月份

EmpID SalaryMonth Salary 
1  January 20000 
1  February 15000 
1  March  25000 

我需要編寫一個查詢來計算工資,直到每個月和輸出應該是如下。每個月的工資都會增加到上個月的工資。

EmpID SalaryMonth Salary 
1  January 20000 
1  February 35000 
1  March  60000 

我試過使用遊標的解決方案,但是我們有沒有其他解決方案可以實現這個目標。

+0

請添加預期的輸出。 –

+0

@JackyMontevirgen請看上面的第二個格式化表格。這是預期的產出,是工資的滾動總和。 –

+0

@TimBiegeleisen啊,我明白了。認爲它與樣本Data相同。 –

回答

1

試試這個!

select EmpID,SalaryMonth,SUM(Salary) OVER(ORDER BY EmpID desc 
    ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) 
      AS Salary 
    FROM t 

Demo

+0

這是假設您使用更新版本的SQL Server(IIRC 2012轉發)的答案 –

+0

這不起作用,因爲您沒有對日期進行排序。因此,我預計滾動金額將毫無意義。 –

+0

@vijaykumar Hadalgi 用戶可能希望根據 不同的empid,按月計算薪金總和。您的查詢不會根據empid對薪水進行分組。 –

0

請使用 「累積總和」 像

選擇t1.id,t1.SomeNumt,SUM(t2.SomeNumt)的總和 從@t T1 內部聯接@上t1.id> = t2.id 組噸T2由t1.id,t1.SomeNumt 爲了通過t1.id

來源:how to get cumulative sum

0

嘗試這個它會幫助你

select * into #emp_sal from 
(
select 1 EmpID  ,'January'as SalaryMonth, 20000 Salary 
union all 
select 1 , 'February', 15000 
union all 
select 1  ,'March',  25000 
union all 
select 2  ,'January',  30000 
union all 
select 2  ,'February',  8000 
)as a 

select EmpID, SalaryMonth ,Salary, 
sum(Salary)over(partition by empid order by SalaryMonth rows BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)as Actual_Salary 
from #emp_sal 
+0

如上所述,這些方法在新版本上可用,我有SQL服務器2008年。所以尋找一些通用的解決方案 – user1770461

0

免責聲明:您應該認真考慮使用標準的SQL Server日期或時間戳列代表SalaryMonth。使用字符串月份名稱會產生各種問題,因此我在下面詳細解答。

我的方法是使用CTE爲每個月份的名稱分配一個數字位置(cte1)。然後,我將其加入您的原始表格(cte2)。最後,我們可以自己加入cte2來計算表格過程中的滾動工資。

可能有一種方法可以使用月份名稱來創建某種類型的日期對象,但我無法想到它,並且無論如何這樣做可能需要分配一個虛擬年份以及可能的其他事物。

WITH cte1 AS (
    SELECT 'January' AS SalaryMonth, 1 AS MonthPos 
    UNION ALL 
    SELECT 'Februrary', 2 
    UNION ALL 
    SELECT 'March', 3 
    UNION ALL 
    SELECT 'April', 4 
    UNION ALL 
    SELECT 'May', 5 
    UNION ALL 
    SELECT 'June', 6 
    UNION ALL 
    SELECT 'July', 7 
    UNION ALL 
    SELECT 'August', 8 
    UNION ALL 
    SELECT 'September', 9 
    UNION ALL 
    SELECT 'October', 10 
    UNION ALL 
    SELECT 'November', 11 
    UNION ALL 
    SELECT 'December', 12 
), 
WITH cte2 AS (
    SELECT t1.EmpID, 
      t1.SalaryMonth, 
      t2.MonthPos, 
      t1.Salary 
    FROM yourTable t1 
    INNER JOIN cte1 t2 
     ON t1.SalaryMonth = t2.SalaryMonth 
) 

SELECT t1.EmpID, 
     t1.SalaryMonth, 
     SUM(t2.Salary) AS Salary 
FROM cte2 t1 
INNER JOIN cte2 t2 
    ON t1.MonthPos >= t2.MonthPos 
GROUP BY t1.EmpID, 
     t1.SalaryMonth