2012-01-19 27 views
1

我有一个联接查询返回多行合并来自不同行的布尔结果分为单列

ID SearchID Bool1  Bool2 Bool2 
1  1   1   1  0 
1  1   0   0  0 
5  1   1   0  0 
6  1   0   0  0 
9  1   0   0  0 

可以省略第一列ID,这给我们留下了

SearchID Bool1  Bool2 Bool2 
1   1   1  0 
1   0   0  0 
1   1   0  0 
1   0   0  0 
1   0   0  0 

由于所有的返回的数据适用于SearchID 1,我想结束一行将合并所有布尔字段的结果,即

SearchID Bool1  Bool2 Bool2 
1   1   1  0 

IsButton应该是1为有一个或多个行与1 自动运行应该是1为有一个或1 IsOnMain多行应该是0,因为是用1

无行,但我想处理这对于可能已经返回的多行,并且我想以每个搜索结果为唯一行结束

ID SearchID Bool1  Bool2 Bool2 
1  1   1   1  0 
1  1   0   0  0 
5  1   1   0  0 
6  1   0   0  0 
9  1   0   0  0 
3  2   0   0  0 
5  2   0   0  0 
3  3   0   0  0 
9  3   0   0  1 
etc... 

SearchID Bool1  Bool2 Bool2 
1   1   1  0 
2   0   0  0 
3   0   0  1 
etc... 

我有道理吗?

回答

4
SELECT SearchID, 
     CAST(CASE WHEN SUM(CAST(Bool1 AS INT)) > 0 THEN 1 ELSE 0 END AS BIT) AS Bool1, 
     CAST(CASE WHEN SUM(CAST(Bool2 AS INT)) > 0 THEN 1 ELSE 0 END AS BIT) AS Bool2, 
     CAST(CASE WHEN SUM(CAST(Bool3 AS INT)) > 0 THEN 1 ELSE 0 END AS BIT) AS Bool3 
FROM Table 
GROUP BY SearchID 
+0

它会抛出一个错误,因为“操作数数据类型位对sum操作符无效”。您可能需要先将其转换。 – vmvadivel

+0

@vmvadivel经过测试......感谢您的领导! –

+0

非常聪明!锻炼了魅力!我确切地看到你在做什么......对存储过程进行更改,现在结果与预期完全一致。再次感谢! – Thierry

3
SELECT SearchId 
    , MAX(CAST(Bool1 AS INT)) AS Bool1 
    , MAX(CAST(Bool2 AS INT)) AS Bool2 
    , MAX(CAST(Bool3 AS INT)) AS Bool3 
FROM TableX 
GROUP BY SearchId 
2

如果您使用的是BIT数据类型,那么你不能直接使用SUM或MAX的功能就可以了。你必须先转换它。

--Sample table 
CREATE TABLE #test 
(
    SearchID INT, 
    Bool1 BIT, 
    Bool2 BIT, 
    Bool3 BIT 
) 
GO 

INSERT #test VALUES (1,1,1,0) 
INSERT #test VALUES (1,0,0,0) 
INSERT #test VALUES (1,1,0,0) 
INSERT #test VALUES (1,0,0,0) 
INSERT #test VALUES (1,0,0,0) 
Go 

SELECT 
    SearchId 
    ,MAX(CONVERT(INT,Bool1)) AS Bool1 
    ,MAX(CONVERT(INT,Bool2)) AS Bool2 
    ,MAX(CONVERT(INT,Bool3)) AS Bool3 
FROM #test 
GROUP BY SearchId 
相关问题