:) J'ai 2 requêtes, et je dois les rejoindre, je dois comparer le temps de travail de l'employé en fonction de l'activité avec le temps de travail total de l'entreprise dans la même activité pendant une période définie
La première requête est:
SELECT u.login,
a.article,
p.p_article,
(SUM(p.p_going) + SUM(p.p_leaving) + SUM(p.p_working)) AS tottime
FROM pos p,users u, articles a
WHERE u.login = p.p_login
AND REPLACE( u.login, '.', '_' ) = 'users_name'
AND p.p_datum >= '2013-04-09'
AND p.p_datum <= '2013-04-16'
AND p.p_article = a.id
GROUP BY a.article
Et ma deuxième requête est:
SELECT a.article,
p.p_article,
(SUM(p.p_going) + SUM(p.p_leaving) + SUM(p.p_working)) AS tottime
FROM pos p, articles a
WHERE p.p_datum >= '2013-04-09'
AND p.p_datum <= '2013-04-16'
AND p.p_article = a.id
GROUP BY a.article
La première requête me renvoie le temps de travail total de WORKER groupé par activités, par exemple:
u.login a.article p.p_article tottime
Ivan Teambuilding 1 3,45
Julie Social_work 2 5,67
La deuxième requête me renvoie le temps de travail total de la SOCIÉTÉ regroupé par activités, par exemple:
a.article p.p_article tottime
Teambuilding 1 150
Social_work 2 260
Je veux avoir quelque chose comme ça, donc je peux comparer le temps total du travailleur par activité avec le temps total des heures de travail de l'entreprise par activité dans une période spécifique:
u.login a.article p.p_article tottime(worker) tottime(company)
Ivan Teambuilding 1 3,45 150
Julie Social_work 2 5,67 260
Dans le cas des valeurs NULL, je voudrais utiliser LEFT JOIN. Je cherchais la solution depuis 3 heures, et tout ce que j'essaye ne fonctionne pas, donc toute aide serait appréciée.
Vous pouvez simplement joindre les 2 requêtes en tant que paire de sous-sélections.
Quelque chose comme:-
SELECT Sub1.a, Sub1.b, Sub2.c
FROM (SELECT a, b FROM z) Sub1
INNER JOIN (SELECT a, c FROM y) Sub2
ON Sub1.a = Sub2.a
Cependant, je ne peux pas vraiment vous donner plus car votre premier exemple de requête ne semble pas ramener les détails que vous dites (ne ramène que 3 colonnes).
EDIT - Avec les requêtes corrigées
SELECT Sub1.login AS User_name, Sub1.article AS Activity, Sub1.p_article AS `Activity id`, Sub1.tottime AS `Totaltime(worker)`, Sub2.tottime AS `Totaltime(company)`
FROM (SELECT u.login,a.article, p.p_article, (SUM(p.p_going) + SUM(p.p_leaving) + SUM(p.p_working)) AS tottime
FROM pos p
INNER JOIN users u ON u.login = p.p_login
INNER JOIN articles a ON p.p_article = a.id
WHERE REPLACE( u.login, '.', '_' ) = 'users_name'
AND p.p_datum >= '2013-04-09'
AND p.p_datum <= '2013-04-16'
GROUP BY a.article) Sub1
INNER JOIN
(SELECT a.article, p.p_article, (SUM(p.p_going) + SUM(p.p_leaving) + SUM(p.p_working)) AS tottime
FROM pos p
INNER JOIN articles a ON p.p_article = a.id
WHERE p.p_datum >= '2013-04-09'
AND p.p_datum <= '2013-04-16'
GROUP BY a.article) Sub2
ON Sub1.p_article = Sub2.p_article
Le plus simple serait d'utiliser des sous-requêtes (bien qu'elles ne soient généralement pas trop efficaces, mais celles GROUP BY
peut rendre d'autres solutions difficiles).
Quelque chose comme ça devrait le faire:
SELECT a.*, b.tottime AS 'Total time (company)'
FROM
(SELECT u.login, a.article, p.p_article, (SUM(p.p_going) + SUM(p.p_leaving) + SUM(p.p_working)) AS 'Total time (worker)'
FROM pos p, users u, articles a
WHERE u.login = p.p_login
AND REPLACE( u.login, '.', '_' ) = 'users_name'
AND p.p_datum >= '2013-04-09'
AND p.p_datum <= '2013-04-16'
AND p.p_article = a.id
GROUP BY a.article) a
LEFT JOIN
(SELECT a.article, p.p_article, (SUM(p.p_going) + SUM(p.p_leaving) + SUM(p.p_working)) AS tottime
FROM pos p, articles a
WHERE p.p_datum >= '2013-04-09'
AND p.p_datum <= '2013-04-16'
AND p.p_article = a.id
GROUP BY a.article) b
ON a.article = b.article /* AND a.p_article = b.p_article ?? */