I’m actually trying to have a number of time that a driver visited a town. I’m close to have the good result, but I need a little bit help to achieve this.
So here it is my database
TABLE_NAME COLUMN_NAME DATA_TYPE ______________________________________ camion immatriculation char <--- PK camion annee date camion kilometrage float _____________________________________ conducteur id_conducteur int <--- PK conducteur nom varchar conducteur date_embauche date _______________________________________ trajet id_conducteur int <--- PK, FK REFERENCES conducteur(id_conducteur) trajet immatriculation char <--- PK, FK REFERENCES camion(immatriculation) trajet date_trajet datetime <--- PK trajet ville_depart int <--- FK REFERENCES ville(id) trajet ville_arrivee int <--- FK REFERENCES ville(id) ______________________________________ ville id int <--- PK ville libelle varchar
Then I want to know by example how many time a driver is gone to every town that he visited
So I tried this:
SELECT * FROM ( SELECT * FROM ( SELECT c.nom, vd.libelle, COUNT(t.ville_depart) AS 'nbr_ville' FROM trajet t JOIN conducteur c ON c.id_conducteur = t.id_conducteur JOIN ville vd ON vd.id = t.ville_depart GROUP BY GROUPING SETS ( (vd.libelle,vd.id,c.nom) ) ) AS depart UNION ALL SELECT * FROM ( SELECT c.nom, va.libelle, COUNT(t.ville_arrivee) AS 'nbr_ville' FROM trajet t JOIN conducteur c ON c.id_conducteur = t.id_conducteur JOIN ville va ON va.id = t.ville_arrivee GROUP BY GROUPING SETS ( (va.libelle,va.id,c.nom) ) ) AS arrivee ) AS touteville ORDER BY touteville.nom,touteville.libelle ;
(I use grouping sets only for learning to use it, but I know that is could be replace by a simple ‘group by’)
So here it is what I have as a result:
nom libelle nbr_ville BERNARD Avignon 2 BERNARD Avignon 1 BERNARD Bordeaux 1 BERNARD Bordeaux 1 BERNARD Nancy 3 BERNARD Nancy 3 BERNARD Paris 1 BERNARD Paris 1 BERNARD Strasbourg 1 DUPONT Bordeaux 1 DUPONT Bordeaux 1 DUPONT Paris 1 DUPONT Paris 1 DUPONT Strasbourg 1 DUPONT Strasbourg 1 MAXIME Lyon 1 MAXIME Lyon 1 MAXIME Paris 1 MAXIME Paris 1 MAXIME Strasbourg 1 MAXIME Toulouse 1 THIERY Avignon 1 THIERY Avignon 2 THIERY Bordeaux 1 THIERY Marseille 1 THIERY Marseille 1 THIERY Nancy 1 THIERY Nancy 1 THIERY Paris 2 THIERY Paris 1 THIERY Strasbourg 1
But I wish I could have group all the result by the column named ‘libelle ‘ which are the name of the town.
How could I do that?
I try to just do a GROUP BY libelle on the ‘touteville’ virtual table, but if I want to do that I have to add ‘nbr_ville’ and ‘nom’ to the group by or add it into a aggregate function, as SQL Server told me.
So what I want to have is:
nom libelle nbr_ville BERNARD Avignon 3 BERNARD Bordeaux 2 BERNARD Nancy 6
Instead of
nom libelle nbr_ville BERNARD Avignon 2 BERNARD Avignon 1 BERNARD Bordeaux 1 BERNARD Bordeaux 1 BERNARD Nancy 3 BERNARD Nancy 3
Advertisement
Answer
Pretty sure you could simplify your entire query to something like this.
SELECT c.nom , vd.libelle , COUNT(t.ville_depart) AS nbr_ville FROM trajet t JOIN conducteur c ON c.id_conducteur = t.id_conducteur JOIN ville vd ON vd.id = t.ville_depart OR vd.id = t.ville_arrivee group by c.nom , vd.libelle order by c.nom , vd.libelle