多重计数(*)的SQL,其中包括“零记录”信息

时间:2012-09-02 05:42:20

标签: sql count group-by

我需要运行查询,查找不同类别的计数。例如: 假设路线号码:10,20,40分类在“短路线”下,路线号码:“45,60和70”分类在“长路线”下。不同的公共汽车在这些路线中的一条或多条路线上行驶。

示例:(A,B,C是公交车号码)

巴士路线

  • A 10
  • A 45
  • B 40
  • B 45
  • B 60
  • A 20
  • C 70

我正在尝试编写一个sql查询,该查询将返回每个总线层不适用的类别数(由该类别的零计数表示) ): 那就是:

  • 巴士号短途长路线
  • A 2 1
  • B 1 2
  • C 0 1

C在短路线上没有铺设(0计数)的信息是必不可少的。如何让我的查询返回上面的结果?

谢谢!

3 个答案:

答案 0 :(得分:4)

您可以使用案例陈述:

SELECT BusNo, 
    SUM (CASE WHEN Route in (10,20,40) THEN 1 ELSE 0 END)) AS ShortRoute,
    SUM (CASE WHEN Route in (45,60,70) THEN 1 ELSE 0 END)) AS LongRoute
FROM RoutesTable
GROUP BY BusNo

如果长/短路线信息包含在另一个表中,请说RouteInfo

SELECT BusNo, 
    SUM (CASE WHEN RouteInfo.Route = 'short' THEN 1 ELSE 0 END)) AS ShortRoute,
    SUM (CASE WHEN RouteInfo.Route = 'long' THEN 1 ELSE 0 END)) AS LongRoute
FROM RoutesTable
    INNER JOIN RouteInfo ON RoutesTable.Route = RouteInfo.Route
GROUP BY BusNo

答案 1 :(得分:0)

此查询可让您走上正确的轨道。它没有经过测试,特别是没有你的数据库的具体细节,但你需要按公交车号码分组,然后你需要分组,如果它是一条短路线。

select BusNo, count(*) FROM Routes GROUP BY BusNo, isShortRoute

答案 2 :(得分:0)

您可以使用CASE指定字段是否符合条件。在这种情况下,我们将检查短路线是否小于或等于40,或者长路线是否大于或等于45.如果为真,则会为其分配1。然后,我们采用短路和长路的SUM,您将获得所需的结果。

SELECT bus_no AS 'Bus No',
    SUM(CASE
        WHEN route <= 40 THEN 1 ELSE 0 END) AS 'Short Route',
    SUM(CASE
        WHEN route >= 45 THEN 1 ELSE 0 END) AS 'Long Route'
FROM bus GROUP BY bus_no