我有一个返回多行的连接查询
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...
我有道理吗?
答案 0 :(得分: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
答案 1 :(得分: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 :(得分: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