基于一列的两个表组合,其中重复值获得自己的列

时间:2017-06-27 04:38:55

标签: sql sql-server data-cleaning

注意:我正在使用SQL Server Management Studio 2014

我在SQL中遇到了一个问题,我想整理一下。总体目标是以非常特定的格式将其导出为ex​​cel。我已经尝试导出原始数据并在Excel中进行所有配置,但他使用的公式不够快,无法执行任务(这是数据清理的噩梦)所以我想我会尝试在SQL中执行此操作我应该从一开始就尝试过。所以我们走了......

我有两个表,我们称之为Table_1和Table_2。

Table_1有一个ID和一个数据列。可以有许多具有不同数据值的相同ID。 (请参阅随附的Excel电子表格了解结构)

Table_2有一个ID列,它是连接两个表的外键。

我想做一个SELECT语句来显示格式的信息,如运行查询后的预期结果所示(再次参见excel表)注意,在运行查询后的预期结果中,每条记录只有一个ID 。 (我正在寻找要在SQL Server Management Studio中显示的查询,而不是直接显示到Excel,显然哈哈只想尽可能清楚)This is the sheet that has the expected Result

这是我能想到的最简单的例子,实际上我需要在Table_1的多个列上运行此查询并显示所有结果。

我觉得我应该尽可能简单地保持它,一旦我对它有所感受,我就可以建立它。我检查了其他一些堆栈的答案,但我在阅读答案时遇到了一些问题,因为它们对我没有意义,或者他们需要完成不同的任务。任何想法或见解将不胜感激!

提前致谢!

1 个答案:

答案 0 :(得分:1)

这正是您所需要的:

with m as (
  select 
    ROW_NUMBER() over (partition by id order by data) as Nr, 
    table_1.id, table_1.data 
  from table_1
)
select 
  table_2.id, 
  m1.data as Mail1,
  m2.data as Mail2,
  m3.data as Mail3,
  m4.data as Mail4
from table_2
left join m m1 on (m1.Nr=1 and m1.id=table_2.id)
left join m m2 on (m2.Nr=2 and m2.id=table_2.id)
left join m m3 on (m3.Nr=3 and m3.id=table_2.id)
left join m m4 on (m4.Nr=4 and m4.id=table_2.id)

结果是:

*-------*------------*----------*----------*-------*      
|id     |Mail1       | Mail2     | Mail3   | Mail4 |         
|5290   |cheese      |  napkin   |pie      |  sauce|        
|7893   |cheetos     |  chipoltle|NULL     | NULL  |        
|10170  |fries       |  NULL     | NULL    | NULL  |         
|10179  |burgers     |  NULL     | NULL    | NULL  |         
|42069  |apple sauce |  chilli   | NULL    | NULL  |        
|78913  |baked beans |  NULL     | NULL    | NULL  |  
*-------*------------*----------*----------*-------*