2009-12-19 5 views
0

J'ai une table appelée employee_salary_master dans laquelle nous conservons les dates d'entrée en vigueur et les dates d'entrée de chaque employé dans l'entreprise. Pour le traitement du salaire d'un employé pour un mois, nous devons aller chercher le dernier enregistrement saisi. Si la date d'entrée en vigueur est inférieure à ce mois-ci, nous sélectionnons l'entrée la plus récente. mais si la date d'entrée en vigueur est supérieure à la première date du mois, alors il y aura plus de une date d'entrée en vigueur pour ce moissql server - aide dans la requête

exemple: les données pour un employé sont comme ci-dessous.

 
SAL_MATSER_ID EMPLOYEE_ID EFFECTIVE_DATE ENTRY_DATE 
------------- ----------- -------------- ------------ 
1    5814  Jan 6 2006 Jan 12 2006 
2    5814  Jan 10 2006 Jul 17 2006 
3    5814  Jan 20 2006 Dec 22 2006 
4    5814  May 10 2007 Jul 18 2007 
5    5814  Nov 1 2007 Dec 18 2007 
6    5814  Aug 1 2008 Aug 20 2008 
7    5814  May 1 2008 Sep 2 2008 
8    5814  Sep 1 2009 Sep 18 2008 
9    5814  Nov 1 2008 Apr 20 2009 
10   5814  Nov 10 2009 Nov 25 2009 
11   5814  Nov 5 2009 Nov 26 2009 

Si je dois obtenir le record de novembre 2009, je vous écris ci-dessous la requête

select EMPLOYEE_SALARY_MASTER_ID, EMPLOYEE_ID, EFFECTIVE_DATE, ENTRY_DATE, ARREAR_PROCESS_FLAG from employee_salary_master esm where employee_id = 5814 
and (esm.entry_date = (select max(entry_date) from employee_salary_master where employee_id = 5814 and effective_date <= @monthfirstdate) 
     or (esm.effective_date between @monthfirstdate and @monthlastdate)) 

qui donne le résultat ci-dessous ..

 
SAL_MATSER_ID EMPLOYEE_ID EFFECTIVE_DATE ENTRY_DATE 
------------- ----------- -------------- ------------ 
9    5814  Nov 1 2008 Apr 20 2009 
10   5814  Nov 10 2009 Nov 25 2009 
11   5814  Nov 5 2009 Nov 26 2009 

Ce que je besoin est la suivante Pour le 1er novembre - 4 novembre, le salaire devrait être traité selon employee_salary_masterId - 9 et 5 au 30 novembre nov salaire doit être traité selon employee_salary_masterId - 11.

 
SAL_MATSER_ID EMPLOYEE_ID EFFECTIVE_DATE ENTRY_DATE 
------------- ----------- -------------- ------------ 
9    5814  Nov 1 2008 Apr 20 2009 
11   5814  Nov 5 2009 Nov 26 2009 

S'il vous plaît aidez-moi à construire cette requête.

+0

Quelle est la règle qui exclut le record le 10 novembre? Vous dites que le 5 au 30 novembre devrait être traité avec le numéro de salaire 11, et non avec le numéro 10 qui commence le 10 novembre. Est-il exclu parce que la date d'entrée est plus tôt? – Ray

Répondre

1

Pas tout à fait sûr si je vous comprends tout à fait correct, mais un coup d'oeil à cet exemple

DECLARE @employee_salary_master TABLE(
     EMPLOYEE_SALARY_MASTER_ID INT, 
     EMPLOYEE_ID INT, 
     EFFECTIVE_DATE DATETIME, 
     ENTRY_DATE DATETIME 
) 

INSERT INTO @employee_salary_master SELECT 1,5814,'Jan 6 2006','Jan 12 2006' 
INSERT INTO @employee_salary_master SELECT 2,5814,'Jan 10 2006','Jul 17 2006' 
INSERT INTO @employee_salary_master SELECT 3,5814,'Jan 20 2006','Dec 22 2006' 
INSERT INTO @employee_salary_master SELECT 4,5814,'May 10 2007','Jul 18 2007' 
INSERT INTO @employee_salary_master SELECT 5,5814,'Nov 1 2007','Dec 18 2007' 
INSERT INTO @employee_salary_master SELECT 6,5814,'Aug 1 2008','Aug 20 2008' 
INSERT INTO @employee_salary_master SELECT 7,5814,'May 1 2008','Sep 2 2008' 
INSERT INTO @employee_salary_master SELECT 8,5814,'Sep 1 2009','Sep 18 2008' 
INSERT INTO @employee_salary_master SELECT 9,5814,'Nov 1 2008','Apr 20 2009' 
INSERT INTO @employee_salary_master SELECT 10,5814,'Nov 10 2009','Nov 25 2009' 
INSERT INTO @employee_salary_master SELECT 11,5814,'Nov 5 2009','Nov 26 2009' 


DECLARE @monthfirstdate DATETIME, 
     @monthlastdate DATETIME 

SELECT @monthfirstdate = '01 Nov 2009', 
     @monthlastdate = '30 Nov 2009' 

SELECt * 
FROM (
      SELECT TOP 1 
        * 
      FROM @employee_salary_master esm 
      WHERE esm.EFFECTIVE_DATE BETWEEN @monthfirstdate and @monthlastdate 
      AND  esm.EFFECTIVE_DATE < esm.ENTRY_DATE 
      ORDER BY esm.ENTRY_DATE DESC 
     ) sub 
UNION ALL 
SELECT * 
FROM (
      SELECT TOP 1 
        * 
      FROM @employee_salary_master esm 
      WHERE esm.EFFECTIVE_DATE <= @monthfirstdate 
      AND  esm.EFFECTIVE_DATE < esm.ENTRY_DATE 
      ORDER BY esm.EFFECTIVE_DATE DESC 
     ) sub 
ORDER BY EFFECTIVE_DATE 
0

La règle pour exclure le 10 novembre enregistrement est que nous avons besoin de filtrer les enregistrements pour le mois de Novembre à which entry_date est plus grand mais effective_date est plus petit. Permettez-moi de vous expliquer les données fournies: En règle générale, l'entrée la plus récente/dernière aura préséance sur les entrées précédentes dans un mois donné, ce qui implique que la date d'entrée du 26 novembre 2009 aurait préséance sur la date d'entrée du 25 nov 2009. Maintenant puisque la date d'entrée en vigueur de SAL_MATSER_ID - 10 est supérieure à celle de SAL_MATSER_ID - 11, l'enregistrement de Nov 10 sera annulé. Si les données avaient été comme ci-dessous, tous les 3 enregistrements auraient été utilisés pour le traitement des salaires.

SAL_MATSER_ID - 9 pour le salaire de 1 nov.-9 nov. SAL_MATSER_ID - 10 pour le salaire de novembre 10 à novembre 14 SAL_MATSER_ID - 11 pour le salaire du 15 novembre au 30 novembre

 
SAL_MATSER_ID EMPLOYEE_ID EFFECTIVE_DATE ENTRY_DATE 
------------- ----------- -------------- ------------ 
9    5814  Nov 1 2008 Apr 20 2009 
10   5814  Nov 10 2009 Nov 25 2009 
11   5814  Nov 15 2009 Nov 26 2009 

Mais depuis SAL_MATSER_ID - 11 est applicable à partir du 5 novembre, le précédent enregistrement est annulé. J'espère que cela explique la situation.

Merci pour votre soutien, sweta