2017-10-19 2 views
-1

J'ai écrit une instruction SQL pour afficher department_id, job_id et des employés avec le salaire le plus bas, mais l'une des conditions exigeait que j'exclus les départements avec les noms 'IT' et 'SALES », qui n'étaient accessibles qu'à partir d'un autre service de table. En tant que tel, j'ai joint les deux tables en utilisant la colonne partagée department_id et j'ai réussi à filtrer les résultats selon les besoins. Cependant, je ne peux pas sélectionner department_id pour afficher le job_id et les salaires. Voilà ce que je suis parvenu à ce jour:SQL: Impossible de sélectionner la colonne jointe

SELECT EMPLOYEES.DEPARTMENT_ID JOB_ID, MIN(SALARY) 
FROM EMPLOYEES JOIN DEPARTMENTS 
ON DEPARTMENTS.DEPARTMENT_ID = EMPLOYEES.DEPARTMENT_ID 
WHERE JOB_ID NOT LIKE '%REP' 
AND DEPARTMENTS.DEPARTMENT_NAME NOT IN ('IT','SALES') 
GROUP BY EMPLOYEES.DEPARTMENT_ID 
HAVING MIN(SALARY) >= 6000 AND MIN(SALARY) <= 18000; 
+0

semble que vous avez une faute de frappe dans la liste de sélection, et sont en conséquence utiliser JOB_ID comme alias pour EMPLOYEES.DEPARTMENT_ID (il doit y avoir une virgule entre). – jmarkmurphy

Répondre

2

Tout d'abord, les alias de table font la requête beaucoup plus facile à lire et écrire:

SELECT e.DEPARTMENT_ID, e.JOB_ID, MIN(e.SALARY) 
FROM EMPLOYEES e JOIN 
     DEPARTMENTS d 
     ON d.DEPARTMENT_ID = e.DEPARTMENT_ID 
WHERE e.JOB_ID NOT LIKE '%REP' AND d.DEPARTMENT_NAME NOT IN ('IT',' SALES') 
GROUP BY e.DEPARTMENT_ID, e.JOB_ID 
HAVING MIN(e.SALARY) >= 6000 AND MIN(e.SALARY) <= 18000; 

Vous avez besoin de toutes les colonnes non agrégées dans le GROUP BY.

+0

J'ai omis la virgule dans l'instruction select parce que c'était la seule façon dont cela fonctionnait, mais maintenant je me rends compte que c'était parce que j'ai raté le job_id en groupe. Merci. – Glaz

1

Une virgule est manquante dans votre requête après l'ID du département dans SELECT - de sorte qu'il considère l'ID du travail comme un alias pour l'ID du département et affiché comme ID du travail dans le résultat de la requête. Mais encore une fois, vous n'avez pas d'emploi ID en clause GROUP BY et ont besoin d'ajouter que dans le groupe par ou doivent utiliser une fonction d'agrégation

SELECT **EMPLOYEES.DEPARTMENT_ID, JOB_ID,** MIN(SALARY) 
    FROM EMPLOYEES JOIN DEPARTMENTS ON DEPARTMENTS.DEPARTMENT_ID=EMPLOYEES.DEPARTMENT_ID 
    WHERE JOB_ID NOT LIKE '%REP' AND DEPARTMENTS.DEPARTMENT_NAME NOT IN('IT','SALES') 
    GROUP BY EMPLOYEES.DEPARTMENT_ID,JOB_ID 
    HAVING MIN(SALARY) >= 6000 AND MIN(SALARY) <= 18000;