2017-03-03 3 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第2のフォーマットされた表を見てください。これは予想される成果であり、給与の回転合計です。 –

+0

@TimBiegeleisenああそうです。サンプルのデータと同じことを考えました。 –

答えて

1

@t t1から

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)のように、 "累積和" を使用してください インナーに参加@how to get cumulative sum

:t1.id

出典t1.id、t1.SomeNumt ORDER BY t1.id> = t2.id グループのトンさt

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 Server 2008もあります。したがって、一般的な解決策を探しています – user1770461

0

お手伝いを致しますこのお試しください:あなたは真剣標準のSQL Serverの日付またはタイムスタンプ列を使用してSalaryMonthを表す検討すべきです。文字列の月の名前を使用すると、あらゆる種類の問題が発生するので、私の冗長な答えは以下のとおりです。

私のアプローチは、各月の名前(cte1)に数値の位置を割り当てるためにCTEを使用することです。次に、私はあなたの元のテーブル(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 
関連する問題