Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
选择在SQL中具有特定where条件的列_Sql_Sql Server - Fatal编程技术网

选择在SQL中具有特定where条件的列

选择在SQL中具有特定where条件的列,sql,sql-server,Sql,Sql Server,我有一个表,包含所有不同类别的名称,如下所示: Name Class Jack A Nick B Simon C David B Linda B Alice C 现在,我想得到一个表,该表以类a、B、C为列,其中包含其尊重类中的名称: A----------B----------C Jack------Nick-------Simon ----------David------Alice ----------Linda-----------

我有一个表,包含所有不同类别的名称,如下所示:

Name   Class

Jack    A

Nick    B

Simon   C

David   B

Linda   B

Alice   C
现在,我想得到一个表,该表以类a、B、C为列,其中包含其尊重类中的名称:

A----------B----------C

Jack------Nick-------Simon

----------David------Alice

----------Linda-----------
如何在SQL查询中获取这样的表?很抱歉,格式不正确,不知道如何在SO中创建表。

在请求末尾使用“分组依据”功能,如下所示:“从分组依据a.tata中选择a.toto、a.tata”。
这里有一个使用聚合的方法。这可能是最简单的方法:

select max(case when class = 'a' then name end) as a,
       max(case when class = 'b' then name end) as b,
       max(case when class = 'c' then name end) as c
from (select name, class, row_number() over (partition by class order by (select NULL)) as seqnum
      from nameclasses
     ) nc
group by seqnum
order by seqnum;
这是我发布的原始方法。它不使用聚合,但会进行大量连接:

select a.name as a, b.name as b, c.name as c
from (select name, row_number() over (order by (select NULL)) as seqnum
      from nameclasses nc
      where class = 'A'
     ) a full outer join
     (select name, row_number() over (order by (select NULL)) as seqnum
      from nameclasses nc
      where class = 'B'
     ) b
     on a.seqnum = b.seqnum full outer join
     (select name, row_number() over (order by (select NULL)) as seqnum
      from nameclasses nc
      where class = 'c'
     ) c
     on c.seqnum = coalesce(a.seqnum, b.seqnum)
order by coalesce(a.seqnum, b.seqnum, c.seqnum);

您所要求的数据实际上不是很相关,在这种情况下,您通常可以通过在客户机应用程序中执行这些工作来获得更好的结果。但这通常是不可能的:

SELECT A.Name as A, B.Name as B, C.Name AS C
FROM 
  (select Name, row_number over (order by name) as ordinal from table where class = 'A') A
FULL JOIN
  (select Name, row_number over (order by name) as ordinal from table where class = 'B') B
     ON B.ordinal = A.ordinal
FULL JOIN
  (select Name, row_number over (order by name) as ordinal from table where class = 'C') C
     ON C.ordinal = coalesce(A.ordinal, B.ordinal)

你需要一张透视表。如果你不知道有多少类,你需要一个动态数据透视表。太好了。我提出了一个类似的完全连接解决方案。我不会想到使用聚合,但可能会更好。谢谢你的帮助!只是想知道,如果表中包含大量数据,哪种方式会更快?@SSilicon。那要看情况了。SQL Server在聚合方面非常好。您需要
类、名称
上的索引。两种方法都试一下,看看会发生什么。