I have an example table like this and I want to sort the entry column which is region, country, city value from column into row with alphabetical order in orderID column with SQL query
list | orderID | entry |
---|---|---|
list1 | AA | Asia |
list1 | AAA | Japan |
list1 | AAB | Thailand |
list1 | AB | Europe |
list1 | ABA | Germany |
list1 | ABAA | Berlin |
list1 | ABAB | Munich |
list1 | ABAC | Hamburg |
Expected output :
list | Region | Country | City |
---|---|---|---|
list1 | Asia | Japan | |
list1 | Asia | Thailand | |
list1 | Europe | Germany | Berlin |
list1 | Europe | Germany | Munich |
list1 | Europe | Germany | Hamburg |
CodePudding user response:
We use inner join to attach the countries to the continents and another inner join to attach the cities to the countries.
select list, region, country, city
from (
select t.list
,t2.entry as region
,t3.entry as country
,case when t.entry != t3.entry then t.entry end as city
,case when count(*) over(partition by t3.entry) > 1 and t3.entry = t.entry then 1 end as mrk
,t.orderID
from t join t t2 on t2.orderID in(left(t.orderID, 2)) and t.entry != t2.entry join t t3 on t3.orderID in(left(t.orderID, 3))
) t
where mrk is null
order by t.orderID
list | region | country | city |
---|---|---|---|
list1 | Asia | Japan | null |
list1 | Asia | Thailand | null |
list1 | Europe | Germany | Berlin |
list1 | Europe | Germany | Munich |
list1 | Europe | Germany | Hamburg |