2014-04-15 73 views
1

我有以下情形: 我有2列,第一列称为AgentID,第二列在代理表中称为AgentName。很少AgentID以“A”开头,少数以“M”开头,我想要做的事情如下:查询将列分成多列

AgentID AgentName 
A123 Name1 
M123 Name2 
A234 Name3 

Aagents AAgentName Magents MAgentName 
A123 Name1  M123 Name2 
A234 Name3  NULL NULL 

这可能吗?我知道这很奇怪,但我的老板想要这样做!

回答

1

试试这个

WITH AAgents AS 
(
    SELECT ROW_NUMBER() over (order by AgentID) AS RN, 
     AgentID AS Aagents, 
     AgentName As AAgentName 
    FROM Agents 
    WHERE LEFT(AgentID,1)='A' 
), 
MAgents As 
(
    SELECT ROW_NUMBER() over (order by AgentID) AS RN, 
     AgentID AS Magents, 
     AgentName As MAgentName 
    FROM Agents 
    WHERE LEFT(AgentID,1)='M' 
) 

SELECT 
    Aagents, 
    AAgentName, 
    Magents, 
    MAgentName 
FROM AAgents 
FULL OUTER JOIN MAgents 
ON AAgents.RN=MAgents.RN 

SQL FIDDLE DEMO

+0

你的回答非常相似,我的,但你用来代替子查询CTE。出于好奇:在这种情况下使用CTE有什么好处? – Szymon

0

试试这个

select * from (select AgentID as Aagents, AgentName as AagentName from table where 
AgentID like 'A%'), (select AgentID as MAgents, AgentName as MAgentName from 
table where AgentID like 'M%') 
0

是这样的:

select 
case when AgentName like 'A%' then name end as Aagents, 
case when AgentName like 'M%' then Name end as Magents 
from tblName 
1

你可以做一个完整的外部2子查询(一个用于代理,一个对于M代理)之间的连接和加入ROW_NUMBER()在一侧具有空值(具有较少记录的一个):

select A.AgentID Aagents, A.AgentName AAgentName, M.AgentID Magents, M.AgentName MAgentName from 
(select *, ROW_NUMBER() over (order by AgentID) rn from Agents where AgentID like 'A%') A 
full outer join 
(select *, ROW_NUMBER() over (order by AgentID) rn from Agents where AgentID like 'M%') M 
on A.rn = M.rn