Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.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 将多行合并为一行_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 将多行合并为一行

Sql 将多行合并为一行,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有下表 Index BookNumber 2 51 2 52 2 53 1 41 1 42 1 43 我试图得出以下结果 Index BookNumber1 Booknumber2 Booknumber3 ---------------------------------------------- 1 41

我有下表

Index    BookNumber  
  2         51 
  2         52 
  2         53 
  1         41  
  1         42 
  1         43
我试图得出以下结果

Index    BookNumber1  Booknumber2  Booknumber3  
----------------------------------------------
  1         41             42           43   
  2         51             52           53  
Index    BN1    BN2    BN3  
------------------------------
  1      41     null   null 
  1      null   42     null 
  1      null   null   43 
  2      51     null   null 
  2      null   52     null 
  2      null   null   53 
我能够提出以下查询,但是输出是意外的

SELECT DISTINCT 
    index,
    CASE WHEN index = 1 THEN Booknumber END AS BookNumber1,
    CASE WHEN index = 2 THEN Booknumber END AS BookNumber2,
    CASE WHEN index = 3 THEN Booknumber END AS BookNumber3
FROM Mytable;
我得到以下输出

Index    BookNumber1  Booknumber2  Booknumber3  
----------------------------------------------
  1         41             42           43   
  2         51             52           53  
Index    BN1    BN2    BN3  
------------------------------
  1      41     null   null 
  1      null   42     null 
  1      null   null   43 
  2      51     null   null 
  2      null   52     null 
  2      null   null   53 

是否有办法将其压缩为仅2行?

假设每个索引的书号始终为3或更少,您可以使用:

with data as
 (select idx,
         booknumber as bn1,
         lag(booknumber, 1) over(partition by idx order by idx, booknumber) as bn2,
         lag(booknumber, 2) over(partition by idx order by idx, booknumber) as bn3
    from books)
select *
  from data
 where data.bn1 = (select max(x.bn1) from data x where x.idx = data.idx)

SQLFIDLE演示在这里:

我不太确定查询中的索引如何与数据中的索引列匹配。但您需要的查询是:

SELECT index,
       max(CASE WHEN index = 1 THEN Booknumber END) AS BookNumber1 ,
       max(CASE WHEN index = 2 THEN Booknumber END) AS BookNumber2,
       max(CASE WHEN index = 3 THEN Booknumber END) AS BookNumber3
FROM Mytable
GROUP BY index;
给出您的数据后,查询看起来更像:

SELECT index,
       max(CASE WHEN ind = 1 THEN Booknumber END) AS BookNumber1 ,
       max(CASE WHEN ind = 2 THEN Booknumber END) AS BookNumber2,
       max(CASE WHEN ind = 3 THEN Booknumber END) AS BookNumber3
FROM (select mt.*, row_number() over (partition by index order by BookNumber) as ind
      from Mytable mt
     ) mt
GROUP BY index;

顺便说一下,索引是一个保留字,所以我假设它只是另一个列名的占位符。否则,您需要使用双引号或方括号对其进行转义。

不要忘记索引是一个保留字。就个人而言,我不喜欢使用保留字作为列名,但您可以使用方括号进行补偿,如我的示例中所示

这将在SQLServer2008中起作用+

declare @t table([Index] int, BookNumber int)
insert @t values
(2,51),(2,52),(2,53),(1,41),(1,42),(1,43)

;with cte as
(
select [Index], BookNumber, 
row_number() over (partition by [Index] order by BookNumber) rn
from @t
)
select [Index], [1] as Booknumber1, [2] as Booknumber2, [3] as Booknumber3
from cte
pivot (max([booknumber]) FOR [rn] IN ([1],[2],[3])) AS pvt 
结果:

Index Booknumber1 Booknumber2 Booknumber3
1     41          42          43
2     51          52          53

欢迎使用StackOverflow:如果您发布代码、XML或数据示例,请在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码示例”按钮{},以很好地格式化和语法突出显示它!那么你也不需要那些蹩脚的标签了!