1

次のような給与表があります。

id | person_id | start_date  | pay
1  | 1234      | 2012-01-01  | 3000
2  | 1234      | 2012-05-01  | 3500
3  | 5678      | 2012-01-01  | 5000
4  | 5678      | 2013-01-01  | 6000
5  | 9101      | 2012-09-01  | 2000
6  | 9101      | 2014-04-01  | 3000
7  | 9101      | 2011-01-01  | 1500
and so on...

ここで、会社のすべての従業員の特定の月の給与の合計を照会したいと考えています。

特定の会社で特定の月に働いた人の ID を既に持っているので、WHERE person_id IN (...) のようなことを行うことができます。

ただし、給与クエリにはいくつか問題があります。たとえば、2012-08 月の結果は次のようになります。

10000

これは 3500+5000+1500 です。

したがって、最大 start_date <= 特定の月の (IN 句のすべての人の) 合計支払額を見つける必要があります。

いろいろなINNER JOINSを試してみましたが、1日が長くて今は考えられません。

どんなヒントでも大歓迎です。

4

2 に答える 2

0

これらにはgroup byを使用する必要があります....

  select person_id,sum(pay) from salary where person_id in(...) group by person_id

お役に立てますように.....

于 2012-09-19T18:22:40.467 に答える
0

アクティブなレコードを取得する必要があります。以下は、問題の月より前の最大開始日を計算することでこれを行います。

select sum(s.pay)
from (select person_id, max(start_date) as maxstartdate
      from salary
      where person_id in ( . . . ) and
            start_date < <first day of month of interest>
      group by person_id
   ) p join
   salary s
   on s.person_id = p.person_id and
      s.maxstartdate = p.start_date

月と ID のリストを入力する必要があります。

ランク付け関数を使用してこれを行うこともできますが、使用している SQL エンジンを指定しません。

于 2012-09-19T18:24:26.363 に答える