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或数据示例,请在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码示例”按钮{},以很好地格式化和语法突出显示它!那么你也不需要那些蹩脚的标签了!