在子查询中将行转换为列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在子查询中将行转换为列相关的知识,希望对你有一定的参考价值。

我在子查询查询中使用它时尝试将行转换为列,如:

select distinct 
    bqtID, bqtName, bqtCity, bqtStatus, bqtManagerName,
    (select 
         max(case when serName = 'Capacity' then serStatus end) Capacity,
         max(case when serName = 'Parking' then serStatus end) Parking
     from 
         tblService 
     where 
         serBqtID = bqtID),
from 
    View_BanquetList 
where 
    bqtID = 1

我收到此错误:

当未使用EXISTS引入子查询时,只能在选择列表中指定一个表达式。

当我单独使用它然后它工作:

select 
     max(case when serName = 'Capacity' then serStatus end) Capacity,
     max(case when serName = 'Parking' then serStatus end) Parking
from 
    tblService 
where 
    serBqtID = 1

结果:

Capacity    Parking
--------    -------
101-200     51-100

为什么在子查询中没有将多行转换为列?

答案

您试图在选择列表中将两列作为一列返回。这不起作用。我不是SQL Server的专家,但对于Oracle,至少会有三个选项。

  1. 将子选择移动到with子句,然后与其连接。
  2. 使用两个子选项,一个用于容量,一个用于停车。
  3. 将子选择移动到from子句并使用成为表的子选择,然后将其连接。

我认为所有这些都应该与SQL Server一起使用。选项3最接近你现在拥有的。

编辑:试试这个:

select distinct 
    v.bqtID, v.bqtName, v.bqtCity, v.bqtStatus, v.bqtManagerName,
    t.Capacity, t.Parking
from 
    (select 
         serBqtID,
         max(case when serName = 'Capacity' then serStatus end) Capacity,
         max(case when serName = 'Parking' then serStatus end) Parking
     from 
         tblService
     group by 
         serBqtID) t 
inner join
    View_BanquetList v on t.serBqtID = v.bqtID
where 
    v.bqtID = 1

以上是关于在子查询中将行转换为列的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL 中将行转换为列值 [关闭]

在实体框架中将行转换为列

使用带有子查询的最大查询将SQL / PL行转换为列

如何在sql中将行转换为列

如何在 SQL Server 中将行动态转换为列

在 SQL 中将行转换为列