2012-01-19 57 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 
相關問題