显示每个司机拜访的城镇数量

时间:2019-10-22 21:17:37

标签: sql sql-server

我实际上是想让驾驶员有一段时间去城镇。 我即将取得好成绩,但是我需要一点帮助来实现这一目标。

这是我的数据库

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

1 个答案:

答案 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