根据条件将行合并为一行

时间:2013-09-24 16:31:18

标签: sql sql-server-2008

我有一个类似于下面的表结构

Create Table #Temp(Name varchar(10),Col1 int,Col2 int,Col3 int,Col4 int,Col5 int)

在这种情况下,表可以重复相同的名称,但其他值不同

所以

示例值可以像

Insert Into #Temp
Values('ABC',1,0,0,1,1)
Insert Into #Temp
Values('ABC',1,0,1,1,0)
Insert Into #Temp
Values('ABC',1,0,1,1,0)
Insert Into #Temp
Values('DEF',0,0,0,1,0)
Insert Into #Temp
Values('DEF',1,0,1,1,1)
Insert Into #Temp
Values('DEF',1,1,0,1,1)

我在这里要做的是为每个名称只选择一行,但选择值为1的优先级列。

所以这种情况下的预期结果是

Name    Col1    Col2    Col3    Col4    Col5
ABC         1    0      1          1    1
DEF         1    1      1          1    1

我通过做类似下面的事情来实现它,这非常好。但是有没有适当(简单)的方法。

SELECT Name,
        (Select top 1 Col1
        from #Temp T 
        Where T.Name=M.Name
        Order By Col1 desc) as Col1,

        (Select top 1 Col2
        from #Temp T 
        Where T.Name=M.Name
        Order By Col2 desc) as Col2,

        (Select top 1 Col3
        from #Temp T 
        Where T.Name=M.Name
        Order By Col3 desc) as Col3,

        (Select top 1 Col4
        from #Temp T 
        Where T.Name=M.Name
        Order By Col4 desc)as Col4,

        (Select top 1 Col5
        from #Temp T 
        Where T.Name=M.Name
        Order By Col5 desc) as Col5
FROM #Temp M
Group By Name

2 个答案:

答案 0 :(得分:2)

在我看来,您需要使用MAX

SELECT  [Name],
        MAX(Col1) Col1,
        MAX(Col2) Col2,
        MAX(Col3) Col3,
        MAX(Col4) Col4,
        MAX(Col5) Col5
FROM #Temp
GROUP BY [Name]

答案 1 :(得分:1)

SELECT 
  Name, 
  Max(Col1) as Col1, 
  Max(Col2) as Col2, 
  Max(Col3) as Col3, 
  Max(Col4) as Col4, 
  Max(Col5) as Col5
FROM #Temp
GROUP BY Name