Sql 多个select语句,但列数不同

Sql 多个select语句,但列数不同,sql,sql-server,sql-server-2008-r2,sql-server-2012,Sql,Sql Server,Sql Server 2008 R2,Sql Server 2012,我正在尝试选择一个职位,然后选择它旁边的报告行 我的问题是: SELECT (SELECT pos.PositionId FROM PositionData pos WHERE pos.PositionId = 1234) as [Topmost], (SELECT pos.PositionId FROM PositionData pos WHERE pos.pdOpsReportLine = 1234) as [Reportline] 我得到的错误是: Msg 512, Level 16,

我正在尝试选择一个职位,然后选择它旁边的报告行

我的问题是:

SELECT (SELECT pos.PositionId
FROM PositionData pos
WHERE pos.PositionId = 1234) as [Topmost],
(SELECT pos.PositionId
FROM PositionData pos
WHERE pos.pdOpsReportLine = 1234) as [Reportline]
我得到的错误是:

Msg 512, Level 16, State 1, Line 1
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
我不想要的是:

Topmost        Reportline
1234           2345
               3456
               4567
               5678
Topmost
1234
2345
3456
4567
5678
其中,topmost是最优秀的员工,如首席执行官,reportline是向他报告的人。

尝试以下方法:

Declare @Topmost int=1234,
@MinPositionId int 


SELECT @MinPositionId=min(pos.PositionId)
FROM PositionData pos
WHERE pos.pdOpsReportLine = @Topmost

select @Topmost Topmost,@MinPositionId Reportline

Union all

SELECT '',pos.PositionId
FROM PositionData pos
WHERE pos.pdOpsReportLine = @Topmost 
and pos.PositionId != @MinPositionId
试试这个:

Declare @Topmost int=1234,
@MinPositionId int 


SELECT @MinPositionId=min(pos.PositionId)
FROM PositionData pos
WHERE pos.pdOpsReportLine = @Topmost

select @Topmost Topmost,@MinPositionId Reportline

Union all

SELECT '',pos.PositionId
FROM PositionData pos
WHERE pos.pdOpsReportLine = @Topmost 
and pos.PositionId != @MinPositionId

如果要以这种格式获取所有数据,可以执行以下操作:

select
    case
       when row_number() over(partition by pos.PositionId order by pos1.pdOpsReportLine) = 1 then
           pos.PositionId
       else
           null
    end as [Topmost],
    pos1.PositionId as [Reportline]
from PositionData as pos
    left outer join PositionData pos1 on pos.PositionId = pos1.pdOpsReportLine
where pos.pdOpsReportLine is null
order by pos.PositionId, pos1.pdOpsReportLine

请参见示例

如果希望以这种格式获取所有数据,可以执行以下操作:

select
    case
       when row_number() over(partition by pos.PositionId order by pos1.pdOpsReportLine) = 1 then
           pos.PositionId
       else
           null
    end as [Topmost],
    pos1.PositionId as [Reportline]
from PositionData as pos
    left outer join PositionData pos1 on pos.PositionId = pos1.pdOpsReportLine
where pos.pdOpsReportLine is null
order by pos.PositionId, pos1.pdOpsReportLine

请参见示例

,这实际上是关于将输出格式化为特定的报表结构,最好通过报表工具或其他表示代码来处理,而不是试图在SQL中将其组合在一起。您使用的是哪种SQL server-2008还是2012?2012具有SQL 2008无法实现的功能。目前我正在使用SQL server 2012。但是报表生成器将在过程中调用它。这实际上是将输出格式化为特定的报表结构,最好通过报表工具或其他表示代码来处理,而不是试图在SQL中将其组合在一起。您使用的是哪种SQL server-2008还是2012?2012具有SQL 2008无法实现的功能。目前我正在使用SQL server 2012。但是报表生成器将在PROC中调用它。