[英]SQL query combine rows based on common id
我有一個具有以下結構的表:
中 | 來自國家 | 從州 | 來自城市 | 發件人地址 | 發件人號碼 | 從公寓 | 到國家 | 城市 | 講話 | 到編號 | 到公寓 |
---|---|---|---|---|---|---|---|---|---|---|---|
123 | 美國 | 德克薩斯州 | 休斯頓 | 井街 | 1 | 日本 | 東京 | 6 | ET3 | ||
123 | 德國 | 不來梅 | 不來梅 | 尼斯街 | 4 | 波蘭 | 華沙 | 9 | ET67 | ||
456 | 法國 | 科西嘉島 | 科西嘉島 | 安茲街 | 3 | 意大利 | 米蘭 | 8 | AEC784 | ||
456 | 英國 | 英國 | 倫敦 | G街 | 2 | 葡萄牙 | 里斯本 | 1 | LP400 |
期望的結果是:
中 | 來自國家 | 從州 | 來自城市 | 發件人地址 | 發件人號碼 | 從公寓 | 到國家 | 城市 | 講話 | 到編號 | 到公寓 | 來自Country1 | 從狀態 1 | 來自City1 | 發件人地址1 | FromNumber1 | FromApartment1 | 前往國家/地區1 | 到城市1 | 到地址1 | ToNumber1 | 到Apartment1 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
123 | 美國 | 德克薩斯州 | 休斯頓 | 井街 | 1 | 日本 | 東京 | 6 | ET3 | 德國 | 不來梅 | 不來梅 | 尼斯街 | 4 | 波蘭 | 華沙 | 9 | ET67 | ||||
456 | 法國 | 科西嘉島 | 科西嘉島 | 安茲街 | 3 | 意大利 | 米蘭 | 8 | AEC784 | 英國 | 英國 | 倫敦 | G街 | 2 | 葡萄牙 | 里斯本 | 1 | LP400 |
我想要實現的是將具有相同 MID 的 1 個表中的多行置於 1 行之下,無論是否存在具有空值的列。
我認為我在嘗試這樣的事情時過於復雜了解決方案(當然結果不是預期的):
select [MID],
STUFF(
(select concat('', [FromCountry])
FROM test i
where i.[MID] = o.[MID]
for xml path ('')),1,1,'') as FromCountry
,stuff (
(select concat('', [FromState])
FROM test i
where i.[MID] = o.[MID]
for xml path ('')),1,1,'') as FromState
,stuff (
(select concat('', [FromCity])
FROM test i
where i.[MID] = o.[MID]
for xml path ('')),1,1,'') as FromCity
,stuff (
(select concat('', [FromAddress])
FROM test i
where i.[MID] = o.[MID]
for xml path ('')),1,1,'') as FromAddress
FROM test o
group by [MID]
...
有什么辦法可以做到這一點?
假設每個MID
不超過 2 行,那么您可以實現一個簡單的 row_number() 解決方案。
您需要將每個 MID 的一行連接到另一行,因此使用 row_number 為每個行分配一個唯一值 - 我無法立即看到表明哪一行應該是“第二”行 - 這是根據 FromCountry 分配行號- 根據需要進行修改。
我沒有復制這里的所有列,但你明白了,沖洗並重復每一列。
with m as (
select *, Row_Number() over(partition by Mid order by FromCountry) seq
from t
)
select m.Mid,
m.fromcountry, m.fromstate,
m2.fromcountry FromCountry1, m2.fromstate FromState1
from m
join m m2 on m.mid = m2.mid and m2.seq = 2
where m.seq = 1;
參見示例小提琴
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.