我实际上是想让驾驶员有一段时间去城镇。 我即将取得好成绩,但是我需要一点帮助来实现这一目标。
这是我的数据库
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
那我想举例说明一个司机去过他参观过的每个城镇多少次了
所以我尝试了这个:
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
;
(我仅将分组集用于学习使用,但我知道可以将其替换为简单的“分组依据”)
这就是我的结果:
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
但是我希望我可以对名为城镇“ libelle”的列进行分组。
我该怎么办?
我尝试仅在“ touteville”虚拟表上执行GROUP BY libelle,但是如果要这样做,则必须将“ nbr_ville”和“ nom”添加到group by或将其添加到聚合函数中,正如SQL Server告诉我的那样。
所以我想拥有的是:
nom libelle nbr_ville
BERNARD Avignon 3
BERNARD Bordeaux 2
BERNARD Nancy 6
代替
nom libelle nbr_ville
BERNARD Avignon 2
BERNARD Avignon 1
BERNARD Bordeaux 1
BERNARD Bordeaux 1
BERNARD Nancy 3
BERNARD Nancy 3
答案 0 :(得分:2)
可以肯定,您可以将整个查询简化为类似的内容。
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