我正在尝试格式化一个select语句。赋值指定必须以这种方式格式化。
我有一个关于出租车服务的数据库。我必须将公司名称,乘客姓名和出租车号码放在一起。简单。但是,输出指定公司名称应仅在输出中出现一次,位于其自己的组的顶部。所以我有:
CREATE VIEW TAXITRIPS(COMPANYNAME, PASSENGERNAME, TAXI#) AS
(SELECT COMPANY.NAME, BOOKING.NAME, VEHICLES.TAXI#
FROM BOOKING JOIN VEHICLES ON BOOKING.TAXI# = VEHICLES.TAXI#
RIGHT OUTER JOIN COMPANY ON VEHICLES.NAME = COMPANY.NAME);
正确的外部联接是为了仍然显示没有预订记录的公司。如果我现在跑:
SELECT * FROM TAXITRIPS ORDER BY COMPANYNAME ASC;
它会给我一些像
COMPANYNAME PASSENGERNAME TAXI#
---------------------------------------------
ABC TAXIS DAVE 192
LEGION CABS
PREMIER CABS SHANE 2154
PREMIER CABS TIM 2169
SILVER SERVICE DAVE 18579
SILVER SERVICE TIM 18124
SILVER SERVICE AARON 18917
军团驾驶室没有结果,所有现场显示等等。分配规范说它必须看起来像这样。
COMPANYNAME PASSENGERNAME TAXI#
---------------------------------------------
ABC TAXIS DAVE 192
LEGION CABS
PREMIER CABS SHANE 2154
TIM 2169
SILVER SERVICE DAVE 18579
TIM 18124
AARON 18917
公司名称只应显示在第一行。 DISTINCT没有帮助。有什么建议吗?
答案 0 :(得分:6)
通常,您可以在应用程序层执行此操作,因为结果集依赖于行的排序 - 这在SQL中是一件坏事。
但你可以这样做:
SELECT (CASE WHEN ROW_NUMBER() OVER (PARTITION BY c.NAME ORDER BY v.TAXI#) = 1
THEN c.NAME
END) as CompanyName, b.NAME, v.TAXI#
FROM COMPANY c LEFT JOIN
VEHICLES v
ON v.NAME = c.NAME LEFT JOIN
BOOKING b
ON b.TAXI# = v.FLIGHT#
ORDER BY c.name, v.taxi#;
注意:我将join
重新排列为LEFT JOIN
s。大多数人发现比RIGHT JOIN
更容易理解。