我需要合并一个具有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中的子查询来进行选择,但是由于性能原因,它实际上是一个较弱的解决方案。
您是否知道如何选择所有这些标志并将其组合成一行?
答案 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)
对于给定的结果集,可以使用MIN
和GROUP 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)
这种情况的一般解决方案是简单地汇总并在列上使用MIN
或MAX
。
SQL Server的数据类型BIT
是古怪的。它有点像BOOLEAN
,但不是真正的布尔值。它有点像非常有限的数字数据类型,但它实际上也不是数字类型。而且,对于这种数据类型,根本没有聚合函数。在标准SQL中,ANY
类型应具有EVERY
和BOOLEAN
。在PostgreSQL中,BIT_OR
有BIT_AND
和BIT
,BOOL_OR
有BOOL_AND
和BOOLEAN
。 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;
您也可以使用CAST
或CONVERT
代替课程。