我需要运行查询,查找不同类别的计数。例如: 假设路线号码:10,20,40分类在“短路线”下,路线号码:“45,60和70”分类在“长路线”下。不同的公共汽车在这些路线中的一条或多条路线上行驶。
示例:(A,B,C是公交车号码)
巴士路线
我正在尝试编写一个sql查询,该查询将返回每个总线层或不适用的类别数(由该类别的零计数表示) ): 那就是:
C在短路线上没有铺设(0计数)的信息是必不可少的。如何让我的查询返回上面的结果?
谢谢!
答案 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