Sql 查询将一列划分为多个列

Sql 查询将一列划分为多个列,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有以下情况: 在agents表中,我有两列,第一列称为AgentID,第二列称为AgentName。很少有AgentID以“A”开头,很少有AgentID以“M”开头,我想做的是: AgentID AgentName A123 Name1 M123 Name2 A234 Name3 Aagents AAgentName Magents MAgentName A123 Name1 M123 Name2 A234 Name3 NULL

我有以下情况: 在agents表中,我有两列,第一列称为AgentID,第二列称为AgentName。很少有AgentID以“A”开头,很少有AgentID以“M”开头,我想做的是:

AgentID AgentName
A123    Name1
M123    Name2
A234    Name3

Aagents AAgentName Magents MAgentName
A123    Name1      M123    Name2
A234    Name3      NULL    NULL
这可能吗?我知道这很奇怪,但我的老板希望这样

试试这个

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%')
大概是这样的:

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

您可以在两个子查询(一个用于a代理,一个用于M代理)和
ROW\u NUMBER()
上的联接之间进行完全外部联接,以使一侧具有空值(记录较少的一侧):

试试这个

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

您的答案与我的答案非常相似,但您使用了CTE而不是子查询。出于好奇:在这种情况下使用CTE有什么好处?
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