我需要一个sql查询来从输入表中获得所需的输出
z4bn682m1#
你可以用一个 UNION 查询,首先选择不同的国家/地区名称,然后选择该国家/地区的每个城市。然后由国家订购产品;价值是一个国家还是一个城市;然后根据值:
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
在dbfiddle上演示
icnyk63a2#
看起来你真的很愿意把这些记录穿插在一起,每个国家后面都是相关的国家。实际的解决方案在很大程度上取决于您的数据,所以让我假设您的数据支持窗口函数、行构造函数 values() 横向连接(sqlserver和postgres是两个候选)。在sql server中,可以执行以下操作:
values()
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
db小提琴演示:
rn | idx | val -: | --: | :----- 1 | 1 | INDIA 1 | 2 | BNG 1 | 2 | CHN 1 | 2 | HYD 2 | 1 | SWEDEN 2 | 2 | STOCK 2 | 2 | VAXO
在postgres,你只需要替换 outer apply 与 cross join lateral :演示。
outer apply
cross join lateral
2条答案
按热度按时间z4bn682m1#
你可以用一个
UNION
查询,首先选择不同的国家/地区名称,然后选择该国家/地区的每个城市。然后由国家订购产品;价值是一个国家还是一个城市;然后根据值:输出:
在dbfiddle上演示
icnyk63a2#
看起来你真的很愿意把这些记录穿插在一起,每个国家后面都是相关的国家。
实际的解决方案在很大程度上取决于您的数据,所以让我假设您的数据支持窗口函数、行构造函数
values()
横向连接(sqlserver和postgres是两个候选)。在sql server中,可以执行以下操作:
db小提琴演示:
在postgres,你只需要替换
outer apply
与cross join lateral
:演示。