Je fais actuellement un travail d'été et je dois prolonger un programme existant.Pouvez-vous accélérer cette requête?
Mon patron m'a demandé de créer un outil pour nos clients afin qu'ils puissent voir combien coûtent leurs employés, par mois. Mais ce n'est pas tout. Le fait est qu'une entreprise peut avoir une ou plusieurs «sociétés» ou sous-entreprises. Nous voulons savoir combien coûte un employé par société dans une entreprise.
Ce sont la table que j'utilise:
- société: un subcompany avec un people_id qui contient le nom, etc., de la société
- feuille de temps: les entrées de feuille de temps qui contiennent des informations de la personne et de la société
- personnes: toutes les personnes ou contacts dans la base de données
- salarystate: contient le salaire d'une personne pour un mois spécifique
- frais généraux: frais généraux pour une personne pour un mois spécifique (Notez que la date est une chaîne (!) formatée comme ceci: AAAA-MM-JJ)
Cette requête fonctionne, mais elle prend beaucoup de temps à s'exécuter. Y a-t-il un moyen de le rendre plus rapide?
Je choisis l'année et le mois, j'obtiens le nom de l'employé (travailleur) et le nom de la société. Ensuite, je sélectionne la somme des minutes que l'employé a travaillé (pour une société spécifique). Et enfin, je calcule le coût en vérifiant son salaire pour ce mois et les frais généraux pour ce mois.
SELECT
YEAR(TS.assigndate) AS timesheet_year,
MONTH(TS.assigndate) AS timesheet_month,
CONCAT(TP.name, ' ', TP.firstname) AS worker,
CONCAT(SP.name, ' ', SP.firstname) AS society,
(
SELECT
SUM(timeunits) AS minutes
FROM timesheet
WHERE
people_id = TP.id AND
society_id = S.id AND
MONTH(assigndate) = timesheet_month
) AS minutes,
(
SELECT (minutes/60)
) AS hours,
(
SELECT(OO.hourtarif + SS.hourtarif) AS cost
FROM salarystate SS, overhead OO
WHERE
people_id = TP.id AND
YEAR(OO.date) = timesheet_year AND
MONTH(OO.date) = timesheet_month AND
CONVERT(SUBSTRING(SS.month FROM 1 FOR 4), UNSIGNED) = timesheet_year AND
CONVERT(SUBSTRING(SS.month, -2), UNSIGNED) = timesheet_month
) AS cost,
(
SELECT (hours * cost)
) AS total_cost
FROM timesheet TS, society S, people SP, people TP
WHERE
S.id = TS.society_id AND
SP.id = S.people_id AND
TP.id = TS.people_id
GROUP BY timesheet_year, timesheet_month, worker, society;
Avez-vous des index sur certaines colonnes de table de base de données? – heb
Non, et je ne peux pas en créer. Je n'ai pas conçu la base de données et je ne peux pas l'ajuster non plus ... –
yo peut mettre à jour le serveur de base de données. :-) – Koekiebox