将包含多个返回数据的行移动到列中,以确保SQL Server中的结果为一行

将包含多个返回数据的行移动到列中,以确保SQL Server中的结果为一行,sql,sql-server,Sql,Sql Server,我目前有一个可以产生多行的连接。我不想使用联接来获得返回结果,而是只想从联接表中返回一个特定列,并在列中列出,以显示每个列中只有一行 select u.city, u.state, u.county, u.zip, c.local_code from usa u left join code c where c.zip = u.zip where zip = '90210' 样本结果 city state county zip local_code -

我目前有一个可以产生多行的连接。我不想使用联接来获得返回结果,而是只想从联接表中返回一个特定列,并在列中列出,以显示每个列中只有一行

select u.city, u.state, u.county, u.zip, c.local_code
from usa u
left join code c where c.zip = u.zip 
where zip = '90210'
样本结果

city       state   county         zip     local_code
----------------------------------------------------
salt lake  utah    lake county    90210   12A
salt pond  utah    lake county    90210   12C
sea salt   utah    lake county    90210   12B
因为一个zip有多个城市,所以我想将其拆分为单独的列,并将其命名为local_code_1-local_code_6,以填充一行中出现的任何潜在代码并删除城市名称

因此,我希望得到如下结果:

state   county         zip     local_code_1 local_code_2 local_code_3 local_code_4 local_code_5 local_code_6
utah    lake county    90210   12A          12C          12B

这段代码需要一些工作来完成您的首选项,但我认为类似的内容可能会对您有所帮助。这是多个CTE的组合,每个CTE都由另一个行号连接

;WITH CTE AS 
(
    SELECT U.CITY, U.STATE, U.COUNTY, U.ZIP, C.LOCAL_CODE
    FROM USA AS U
    LEFT JOIN CODE C WHERE C.ZIP = U.ZIP 
    WHERE ZIP= '90210'
)

SELECT *
FROM CTE AS C
LEFT JOIN CTE_JoinedTable AS C2 ON C.ID = C2.ID AND C2.RowNumb = 2
LEFT JOIN CTE_JoinedTable AS C3 ON C.ID = C3.ID AND C3.RowNumb = 3
LEFT JOIN CTE_JoinedTable AS C4 ON C.ID = C4.ID AND C3.RowNumb = 4
LEFT JOIN CTE_JoinedTable AS C5 ON C.ID = C5.ID AND C3.RowNumb = 5
LEFT JOIN CTE_JoinedTable AS C6 ON C.ID = C6.ID AND C3.RowNumb = 6
WHERE C.RowNumb = 1

正如上面Andrea所暗示的,您正在搜索轴心结构。您可以按州、县和zip分配序列nr,然后以该值为中心

DECLARE @t TABLE([city] VARCHAR(255),[state] VARCHAR(255),[county] VARCHAR(255),[zip] VARCHAR(25),[local_code] VARCHAR(25));
INSERT INTO @t VALUES
 ('salt lake','utah','lake county','90210','12A')
,('salt pond','utah','lake county','90210','12C')
,('sea salt','utah','lake county','90210','12B');

SELECT pvt.*
FROM (
     SELECT [state]
           ,[county]
           ,[zip]
           ,[local_code]
           ,[seq]=ROW_NUMBER() OVER(PARTITION BY [state],[county],[zip] ORDER BY [local_code] ASC)
     FROM @t
) src PIVOT(MAX(local_code) FOR seq IN([1],[2],[3],[4],[5],[6])) AS pvt;
屈服

state           county          zip        1     2     3     4     5     6
--------------- --------------- ---------- ----- ----- ----- ----- ----- -----
utah            lake county     90210      12A   12B   12C   NULL  NULL  NULL
你可以使用pivot

select state,country,zip,[1] as local_code1,
[2] as local_code2,
[3] as local_code3,
[4] as local_code4,
[5] as local_code5,
[6] as local_code6
from 
(
   select state,country,zip,local_code,
    rn= row_number() over (partition by state,country,zip order by local_code)
    from t
  ) sr PIVOT (max(local_code) for rn in ([1],[2],[3],[4],[5],[6]) ) as pvt


你可以试试PIVOT,看一个例子@Lynx它有帮助吗?
 state  country     zip     local_code1     local_code2     local_code3     local_code4     local_code5     local_code6
utah   lake county 90210       12A            12B              12C            (null)        (null)        (null)