簡體   English   中英

SQL 查詢根據公共 id 組合行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM