【问题标题】:SQL view on table to combine rows into additional columns表上的 SQL 视图以将行组合成附加列
【发布时间】:2021-11-04 03:25:42
【问题描述】:

这让我有点难过,我有一张这样的桌子

Id Address Address 1 Postcode
1 1 straight street 4 corners BL51 ANK
1 46 Double Close Some Place ZE12 7TB
2 7 The Fields Farmland FA7 5ME

我需要创建一个会产生这个结果的视图:

Id Address Address 1 Postcode Address Address 1 Postcode
1 1 straight street 4 corners BL51 ANK 46 Double Close Some Place ZE12 7TB
2 7 The Fields Farmland FA7 5ME

因此,基本上基于 ID 可以有 4 到 50 行,我需要将其作为单行返回,其中包含包含不同数据的多列。我不想进行 50 次连接,因为我确信有更聪明的方法可以做到这一点。

非常感谢任何帮助。

【问题讨论】:

  • 你的数据库是什么?
  • 每个Id 是否总是最多有2条记录?确定哪个地址在左边的逻辑是什么?
  • SQL Server 2016。ID 最多可以有 50 条记录,并且是公司的唯一标识符,该公司最多可以有 50 个地址。我们需要将其输入到一些 OCR 软件中,他们需要将其操作到具有多列的 1 行中。
  • 根据问题指南,请展示您的尝试并告诉我们您发现了什么(在本网站或其他地方)以及为什么它不能满足您的需求。
  • 抱歉,我尝试加入 x 50 次,但确实重复,希望有更好的方法。我尝试查看聚合,但它与连接之间并没有太大区别。所以寻找一些关于如何做到这一点的指示。搜索这个网站我可以看到一些例子,但没有与这个用例相关的 1 个表。

标签: sql sql-server sql-server-2016 sql-view


【解决方案1】:

您可以使用条件聚合(或pivot)。比 50 次连接更简单、更快,但仍然很麻烦:

select id,
       max(case when seqnum = 1 then address end),
       max(case when seqnum = 1 then address1 end),
       max(case when seqnum = 1 then postcode end),
       max(case when seqnum = 2 then address end),
       max(case when seqnum = 2 then address1 end),
       max(case when seqnum = 2 then postcode end),
       . . .
       max(case when seqnum = 50 then address end),
       max(case when seqnum = 50 then address1 end),
       max(case when seqnum = 50 then postcode end)
from (select t.*,
             row_number() over (partition by id order by (select null)) as seqnum
      from t
     ) t
group by id;

代码非常重复,因此在电子表格中生成它很简单。

【讨论】:

  • 感谢您的建议
猜你喜欢
  • 2017-08-23
  • 1970-01-01
  • 2016-03-29
  • 2021-10-21
  • 1970-01-01
  • 1970-01-01
  • 2013-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多