0

我需要运行一个查询来查找不同类别的计数。例如:假设路线号:10,20,40 归类为“短线”,路线号:“45,60 和 70”归类为“长线”。不同的公共汽车在其中一条或多条路线上穿行。

示例:(A、B、C 为总线编号)

巴士号码 路线

  • 一个 10
  • 45
  • B 40
  • B 45
  • B 60
  • 一个 20
  • C 70

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

  • 巴士号码 短线 长线
  • 一个 2 1
  • 乙 1 2
  • 0 1

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

谢谢!

4

3 回答 3

4

您可以使用 case 语句:

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
于 2012-09-02T05:51:30.063 回答
0

这个查询应该让你走上正轨。它没有经过测试,特别是没有更多的数据库细节,但你需要按巴士号码分组,然后如果它是短途路线,你需要分组。

select BusNo, count(*) FROM Routes GROUP BY BusNo, isShortRoute
于 2012-09-02T05:50:31.750 回答
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
于 2012-09-02T05:58:25.683 回答