我有一张 struct 如下的桌子:

MID FromCountry FromState FromCity FromAddress FromNumber FromApartment ToCountry ToCity ToAddress ToNumber ToApartment
123 USA Texas Houston Well Street 1 Japan Tokyo 6 ET3
123 Germany Bremen Bremen Nice Street 4 Poland Warsaw 9 ET67
456 France Corsica Corsica Amz Street 3 Italy Milan 8 AEC784
456 UK UK London G Street 2 Portugal Lisbon 1 LP400

预期结果是:

MID FromCountry FromState FromCity FromAddress FromNumber FromApartment ToCountry ToCity ToAddress ToNumber ToApartment FromCountry1 FromState1 FromCity1 FromAddress1 FromNumber1 FromApartment1 ToCountry1 ToCity1 ToAddress1 ToNumber1 ToApartment1
123 USA Texas Houston Well Street 1 Japan Tokyo 6 ET3 Germany Bremen Bremen Nice Street 4 Poland Warsaw 9 ET67
456 France Corsica Corsica Amz Street 3 Italy Milan 8 AEC784 UK UK London G Street 2 Portugal Lisbon 1 LP400

我试图实现的是将一个表中具有相同MID的多行放在一行下,而不管是否有具有空值的列.

我认为我在try 这样的事情时把解决方案复杂化了(当然结果不是预期的):

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\u number()解决方案.

您需要将每个MID的一行连接到另一行,因此使用row\u number for each MID分配一个唯一的值-我无法立即看到任何东西指示哪一行应该是"第二"行-这是基于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;

参见example fiddle

Sql相关问答推荐

Access 365将文本转换回BigInt

如何更新SQLite数据库中的表?

SQL:如何将相应位置的两个数组中的元素组合在一起

从字符串中删除";1、";和";2,";,而不删除";11、";和";12、";

将Dense_RANK列为聚合(非解析)函数(&A)

从包含PostgreSQL中的JSON值的列中提取列表或目录

根据时间、状态和相关行在PostgreSQL中的存在来删除行

从给定数据中查找下一个工作日期

Snowflake 中的分层数据

根据具有特定值的 ID 创建自定义组

Postgresql 生成器列导致语法错误

根据要过滤的列的值进行联接和分组

SQL 多个不满足的条件失败

使用in和and运算符过滤记录的条件

为什么 get_json_object() 无法从存储在 Hive SQL 表中的 JSON 中提取值?

Snowflake 中的对象是如何比较的?

如何 Select 一列具有最小值而另一列具有给定值的记录?

连接表时避免重复

交叉应用 OPENJSON / PIVOT - 错误的顺序

有条件求和