在单行中选择多个值-SQL Server

时间:2019-02-20 13:15:10

标签: sql sql-server

我需要合并一个具有ID和各种位标记的表

-----------------
a1 | x |   | x |
-----------------
a1 |   | x |   |
-----------------
a1 |   |   |   |
-----------------
b2 | x |   |   |
-----------------
b2 |   |   |   |
-----------------
c3 | x | x | x |

以这种形式

-----------------
a1 | x | x | x |
-----------------
b2 | x |   |   |
-----------------
c3 | x | x | x |

问题是数据通过选项ID的种类进行联接,每个选项都有一个唯一的ID,该ID与a1,b2联接。当我尝试使用DISTINCT进行选择时,我收到了表号1的结果。我可以通过SELECT中的子查询来进行选择,但是由于性能原因,它实际上是一个较弱的解决方案。

您是否知道如何选择所有这些标志并将其组合成一行?

4 个答案:

答案 0 :(得分:3)

使用聚合

select col1 ,max(col2),max(col3),max(col4)
form table_name group by col1

答案 1 :(得分:1)

您要聚合:

select col1, max(col2), max(col2), max(col3)
from table t
group by col1;

这假设空白值为null

答案 2 :(得分:1)

对于给定的结果集,可以使用MINGROUP BY

SELECT 
tbl.Col
, MIN(tbl.Col1) Col1
, MIN(tbl.Col2) Col2 
, MIN(tbl.Col3) Col3 
FROM @table tbl
GROUP BY tbl.Col

但是,如果您有空行,请使用MAX()。否则MIN()返回空行:

SELECT 
tbl.Col
, MAX(tbl.Col1) Col1
, MAX(tbl.Col2) Col2 
, MAX(tbl.Col3) Col3 
FROM @table tbl
GROUP BY tbl.Col

例如:

DECLARE @table TABLE
(
    Col  VARCHAR(50),
    Col1 VARCHAR(50), 
    Col2 VARCHAR(50), 
    Col3 VARCHAR(50) 
)

INSERT INTO @table
(
    Col,
    Col1,
    Col2,
    Col3
)
VALUES
(   'a1', -- Col - varchar(50)
    'x', -- Col1 - varchar(50)
    Null, -- Col2 - varchar(50)
    'x'  -- Col3 - varchar(50)
    )
, ('a1', NULL, 'x', null)
, ('a1', NULL, 'x', null)
, ('b2', 'x', null, null)
, ('b2', null, null, null)
, ('c3', 'x', 'x', 'x')

SELECT 
tbl.Col
, MIN(tbl.Col1) Col1
, MIN(tbl.Col2) Col2 
, MIN(tbl.Col3) Col3 
FROM @table tbl
GROUP BY tbl.Col

输出:

Col Col1    Col2    Col3
a1   x        x       x
b2   x       NULL   NULL
c3   x        x       x

答案 3 :(得分:1)

这种情况的一般解决方案是简单地汇总并在列上使用MINMAX

SQL Server的数据类型BIT是古怪的。它有点像BOOLEAN,但不是真正的布尔值。它有点像非常有限的数字数据类型,但它实际上也不是数字类型。而且,对于这种数据类型,根本没有聚合函数。在标准SQL中,ANY类型应具有EVERYBOOLEAN。在PostgreSQL中,BIT_ORBIT_ANDBITBOOL_ORBOOL_ANDBOOLEAN。 SQL Server一无所有。

因此,在其上使用MIN(按位与)或MAX(按位或)之前,请将列转换为数字类型。例如

select
  id,
  max(bit1 + 0) as bit1agg,
  max(bit2 + 0) as bit2agg,
  max(bit3 + 0) as bit3agg
from mytable
group by id
order by id;

您也可以使用CASTCONVERT代替课程。