有一个表格,其中包含国家和城市列,如下表输入所示。我需要如下所述的输出
Posted
技术标签:
【中文标题】有一个表格,其中包含国家和城市列,如下表输入所示。我需要如下所述的输出【英文标题】:There is a table having country and city columns as shown in the below table input. I need the output as mentioned below 【发布时间】:2020-06-13 03:04:58 【问题描述】:我需要一个 SQL 查询来从输入表中获取所需的输出
【问题讨论】:
请用您正在使用的数据库标记您的问题:mysql、sql-server、postgresql...? 您应该在表示层(例如 php)中处理这个,不是在 SQL 中。 【参考方案1】:您可以使用UNION
查询来执行此操作,首先选择不同的国家/地区名称,然后选择该国家/地区的每个城市。然后按国家订购输出;值是国家还是城市;然后按值:
SELECT DISTINCT country AS data, country, 1 AS ctry
FROM cities
UNION ALL
SELECT city, country, 0
FROM cities
ORDER BY country, ctry DESC, data
输出:
data country ctry
India India 1
BNG India 0
CHN India 0
HYD India 0
Sweden Sweden 1
GOTH Sweden 0
STOCK Sweden 0
VAXO Sweden 0
Demo on dbfiddle
【讨论】:
@PrashantSrivastav 不用担心 - 我很高兴能提供帮助。【参考方案2】:看起来你真的愿意交错记录,每个国家后面跟着它的相关国家。
实际的解决方案在很大程度上取决于您的数据,所以让我假设您的支持窗口函数、行构造函数 values()
和横向连接(SQL Server 和 Postgres 是两个候选者)。
在 SQL Server 中,您可以这样做:
select distinct rn, idx, val
from (
select t.*, dense_rank() over(order by country) rn
from mytable t
) t
cross apply (values (t.country, 1), (t.city, 2)) as v(val, idx)
order by rn, idx, val
Demo on DB Fiddle:
rn |编号 |值 -: | --: | :----- 1 | 1 |印度 1 | 2 | BNG 1 | 2 |中国 1 | 2 |水电 2 | 1 |瑞典 2 | 2 |股票 2 | 2 | VAXO在 Postgres 中,您只需将 outer apply
替换为 cross join lateral
:Demo。
【讨论】:
我猜第一个选择需要一个独特的不重复印度 3x @TimBiegeleisen:确实...回答更新(假设数据库 OP 正在使用)。以上是关于有一个表格,其中包含国家和城市列,如下表输入所示。我需要如下所述的输出的主要内容,如果未能解决你的问题,请参考以下文章