在单行中选择多个值 - SQL 服务器



>我需要合并一个带有 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 中的子查询来做到这一点,但由于性能原因,它确实是弱解决方案。

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

使用聚合

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

对于给定的结果集,它有资格使用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

你想要聚合:

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

这假设空白值为null

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

然而,SQL Server的数据类型BIT是古怪的。它有点像BOOLEAN,但不是真正的布尔值。它有点像非常有限的数值数据类型,但它也不是真正的数值类型。并且根本不存在此数据类型的聚合函数。在标准 SQL 中,您需要ANYEVERYBOOLEAN类型。在PostgreSQL中,你有BIT_ORBIT_AND用于BITBOOL_ORBOOL_AND用于BOOLEAN。SQL Server什么都没有。

因此,在对列使用MIN(按位 AND)或MAX(按位 OR)之前,将列转换为数值类型。

例如
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代替当然。

最新更新