2016-03-11 1 views
1

J'ai un nom de table Emp_mon_day qui se compose d'employés actuels et détails Absent.Calculer nos jours et en l'absence de la table

Ce que je veux est

J'ai besoin pour ces 9 employés, des informations sur nos jours et jours d'absence pour chaque employé de Emp_mon_day tableau fusionné en dessous de requête

QUERY

SELECT e.comp_mkey, 
    e.status, 
    e.resig_date, 
    dt_of_leave, 
    e.emp_name, 
    e.date_of_joining, 
    e.emp_card_no, 
    a.pl_days, 
    pl_days_opening, 
    a.month1, 
    a.month2, 
    a.month3, 
    a.month4, 
    a.month5, 
    a.month6, 
    a.month7, 
    a.month8, 
    a.month9, 
    a.month10, 
    a.month11, 
    a.month12,  
    a.month1 + a.month2 + a.month3 + a.month4 + a.month5 + a.month6 + a.month7 + a.month8 + a.month9 + +a.month10 + a.month11 + a.month12 AS pl_sum 
    FROM p_leave_allocation AS a 
    INNER JOIN 
    emp_mst AS e 
    ON a.emp_card_no = e.emp_card_no 
    WHERE a.year = 2016 
    AND (datediff(MONTH, e.date_of_joining, CONVERT (DATETIME, getdate(), 103)) >= 6 
     AND datediff(MONTH, e.date_of_joining, CONVERT (DATETIME, getdate(), 103)) <= 36) 
    AND (e.resig_date IS NULL 
     OR (e.dt_of_leave IS NOT NULL 
      AND e.dt_of_leave >= CONVERT (DATETIME, getdate(), 103))) 
    AND e.status IN ('A', 'S') 
    AND e.comp_mkey IN (7, 110) 
    AND a.Year = 2016; 

La requête ci-dessus me donne des données comme ci-dessous

[! [Les données d'image] [1]] [1]

détails de la colonne pour Emp_mon_day est inférieure

[! [Enter image description ici] [2]] [2]

+0

Quel doit être le format de sortie? Voulez-vous répéter chacun de ces 9 enregistrements pour tous les jours? – DhruvJoshi

+0

@DhruvJoshi: Naah, voir le calcul de ces employés de présents, absent je veux fusionner cela dans cette requête – BNN

+0

Dans ce cas voulez-vous compter le nombre de présent/jours absents – DhruvJoshi

Répondre

1

Vous pouvez essayez la requête ci-dessous:

SELECT e.comp_mkey, e.status, e.resig_date, dt_of_leave, e.emp_name, 
    e.date_of_joining, e.emp_card_no, a.pl_days, pl_days_opening, a.month1, 
    a.month2, a.month3, a.month4, a.month5, a.month6, a.month7, a.month8, 
    a.month9, a.month10, a.month11, a.month12,  
    a.month1 + a.month2 + a.month3 + a.month4 + a.month5 + a.month6 + a.month7 + a.month8 + a.month9 + +a.month10 + a.month11 + a.month12 AS pl_sum, 
    m.[DaysAbsent],m.[DaysPresent] 
    FROM p_leave_allocation AS a 
    INNER JOIN 
    emp_mst AS e 
    ON a.emp_card_no = e.emp_card_no 
    INNER JOIN 
    (
    SELECT 
     comp_mkey,emp_mkey,[month],[year], 
     SUM(CASE WHEN data ='AB' THEN 1 ELSE 0 END) AS [DaysAbsent], 
     SUM(CASE WHEN data ='P' THEN 1 ELSE 0 END) AS [DaysPresent] 
    FROM 
     (
     SELECT comp_mkey,emp_mkey,[month],[year],[Day1],[Day2],[Day3],[Day4],[Day5] 
     --,... 
     FROM Emp_mon_day 
     ) source 
     UNPIVOT 
     (
     data FOR day IN ([Day1],[Day2],[Day3],[Day4],[Day5]) -- dynamic query can generate all days data 
     )up 
     GROUP BY comp_mkey, emp_mkey,[month],[year] 
    ) AS m 
    ON m.comp_mkey=e.Comp_mkey and m.emp_mkey=e.mkey 
    --- ABOVE CRITERIA NEEDS TO BE CHECKED 
    WHERE a.year = 2016 
    AND (datediff(MONTH, e.date_of_joining, CONVERT (DATETIME, getdate(), 103)) >= 6 
     AND datediff(MONTH, e.date_of_joining, CONVERT (DATETIME, getdate(), 103)) <= 36) 
    AND (e.resig_date IS NULL 
     OR (e.dt_of_leave IS NOT NULL 
      AND e.dt_of_leave >= CONVERT (DATETIME, getdate(), 103))) 
    AND e.status IN ('A', 'S') 
    AND e.comp_mkey IN (7, 110) 
    AND a.Year = 2016; 

Explication:

Nous avons ajouté un autre INNER JOIN à la requête existante pour obtenir des données collationnées de DaysPresent et DaysAbsent

Pour optimiser davantage, je vous suggère d'appliquer immédiatement après WHERE clause source mis

WHERE comp_mkey IN (7, 110) AND Year = 2016; 
+0

Cela signifie que vous n'avez pas de colonne 'emp_card_no' dans Emp_mon_day'. S'il vous plaît laissez-moi savoir les critères de jointure entre 'Emp_mon_day' et' emp_mst' – DhruvJoshi

+0

@coder s'il vous plaît vérifier à nouveau – DhruvJoshi

+0

@coder Je ne peux pas résoudre au-delà de cela car je n'ai pas accès au schéma et aux données. S'il vous plaît dépanner en exécutant la requête interne pour voir si cela produit des données. Si c'est le cas, la prochaine chose à faire est d'examiner les critères de jointure afin que les données arrivent correctement. Puisque vous obtenez maintenant 0 enregistrements, INNER JOIN est à blâmer car il ne correspond à rien entre deux tables. – DhruvJoshi