我有3张桌子-大洲,国家/地区信息和航班。
我想运行一个查询,通过计算过去预订过0个航班的国家数量来按DESC顺序对各大洲进行排名。但是显示大洲的NAME而不是其ID
大陆表-cont_id(P-KEY),名称为varchar,注释为varchar
国家/地区表-cntry_id(P-KEY),名称为varchar,缩写为varchar
航班信息表-cntry_id int,cont_id int,航班浮动,日期日期
我正在Metabase上进行操作,到目前为止,除了显示大洲名称外,我已经设法使它完成所有工作,仅显示其ID。我尝试过嵌套主查询,并尝试使用联接,但是都没有用
SELECT "public"."flights_info"."cont_id", count(*) AS "count"
FROM "public"."flights_info"
WHERE "public"."flights_info"."flights" <= 0
GROUP BY "public"."flights_info"."cont_id"
ORDER BY "count" DESC
我已经成功获取了cont_id,我只需要一行代码即可使其从大洲表中运行并为我提供与ID匹配的名称(我只希望这些名称不显示ID)< / p>
答案 0 :(得分:1)
因此,简单的答案是进行查询,将其重新格式化一下,然后向大洲表中添加INNER JOIN
。这样的事情可能会起作用:
SELECT
c.[name] AS continent_name,
COUNT(*) AS [count]
FROM
[public].flights_info f
INNER JOIN [public].continents c ON c.cont_id = f.cont_id
WHERE
f.flights <= 0
GROUP BY
c.[name]
ORDER BY
2 DESC;
但是,我不确定您的原始查询是正确的。您说过,您想计算每个大洲的国家数,而历史上没有预订任何航班,我也不认为这是您要计算的。取而代之的是,您计算的是航班数量为0或小于零的每个洲的行数。现在,也许这实际上就是数据库的工作方式,如果是这样的话,那么很酷,上面的查询应该使您进入正确的轨道。
但是,如果该数据库能够像我认为的那样工作,那么您将需要一个非常不同的查询,例如这个:
SELECT
c.[name] AS continent_name,
COUNT(DISTINCT cn.cntry_id) AS [count]
FROM
[public].continents c
INNER JOIN [public].country cn ON cn.cont_id = c.cont_id
LEFT JOIN [public].flights_info f ON f.cont_id = c.cont_id AND f.cntry_id = cn.cntry_id
WHERE
ISNULL(f.flights, 0) <= 0
GROUP BY
c.[name]
ORDER BY
2 DESC;
这是如何工作的?好吧,它从大洲表开始,然后将其链接到国家,以获得每个大洲的国家列表。然后,它对广告投放表执行LEFT JOIN
,因此即使没有广告投放数据也将获得匹配。最后,它计算出航班值等于或小于0或根本没有航班数据的国家/地区的数量。
即使这可能也不正确,就好像您为一个国家/地区设置了两行(我假设航班表针对每个大洲,国家/地区和日期都设置了一行),其中一个航班数= 0且一个人的航班数= 10,那么这仍然会报告该国家/地区没有航班。但是,现在我与原来的问题距离太远了……
答案 1 :(得分:0)
您可以使用联接或子查询来完成
使用JOIN
您只需要与基于Continents表的cont_id列连接并获取Continents名称。
select Continents.name, count(*) AS "count"
FROM flights_info flights_info
join Continents Continents
on Continents.cont_id = flights_info.cont_id
WHERE flights_info.flights <= 0
GROUP BY flights_info.cont_id,Continents.name
ORDER BY "count" DESC
使用子查询
您可以编写另一个查询,通过匹配cont_id为您提供大陆名称。
select (select Continents.name from Continents Continents where Continents.cont_id =
flights_info.cont_id ) Continent_name, count(*) AS "count"
FROM flights_info flights_info
WHERE flights_info.flights <= 0
GROUP BY flights_info.cont_id
ORDER BY "count" DESC