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 AutoRun 应为 1,因为有一行或多行为 1 IsOnMain 应为 0,因为没有行为 1

但我想为可能已返回的多行处理此问题,并且我想为每个 searchid 最终得到一个唯一的行

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

3 回答 3

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
于 2012-01-19T02:05:14.153 回答
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
于 2012-01-19T02:04:29.493 回答
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
于 2012-01-19T02:19:13.883 回答