有一个表格,其中包含国家和城市列,如下表输入所示。我需要如下所述的输出

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 lateralDemo

【讨论】:

我猜第一个选择需要一个独特的不重复印度 3x @TimBiegeleisen:确实...回答更新(假设数据库 OP 正在使用)。

以上是关于有一个表格,其中包含国家和城市列,如下表输入所示。我需要如下所述的输出的主要内容,如果未能解决你的问题,请参考以下文章

where 从具有列外键的表中查询

具有动态列名和多个输入列的 PostgreSQL 交叉表

从国家、州、城市和每个城市纬度/经度的数据库查询构建 JSON

在同一页面中克隆选择框选项值

计算电子表格中的不同值

获取正则表达式以解析表格列的xml格式数据