将包含多个返回数据的行移动到列中,以确保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)