2016-04-28 24 views
0

如果標題不清楚,很抱歉。我有一個簡單的表T1
根據組中的col值選​​擇true/false

counter int, not null 
type nvarchar(250), not null 
name nvarchar(50), not null 

我總結按類型分組的計數器,就像這樣:

select sum(counter), type 
    from T1 
    group by type; 

我想選擇一個更字段,它是布爾(真/假)這是任何名稱都包含特定文本,即如果name like '%Bassem%'則選擇true。但自從我使用group by之後我無法弄清楚。

回答

2

這裏有一個辦法做到這一點。

首先創建一個測試表,並插入一些值:

CREATE TABLE dbo.T 
(
    [counter] int not null, 
    [type] nvarchar(250) not null, 
    [name] nvarchar(50) not null 
); 

INSERT INTO dbo.T ([counter], [type], [name]) 
    VALUES (1, N'Alpha', N'Bassem Akl'), 
     (2, N'Alpha', N'aaaaa'), 
     (3, N'Alpha', N'Akl Bassem'), 
     (4, N'Bravo', N'bbbbb'), 
     (5, N'Bravo', N'A Bassem'), 
     (6, N'Charlie', N'ccccc'), 
     (7, N'Charlie', N'ddddd'); 

然後用CTE(公共表表達式),以確定是否名稱包含您正在搜索的文本。您不必在此使用CTE,但它使整個SELECT語句更易於理解。

WITH cte AS 
(
    SELECT [counter], [type], IIF([name] LIKE N'%Bassem%', 1, 0) AS 'contains' 
     FROM dbo.T 
) 
SELECT SUM([counter]) AS 'SumCounter', [type], CAST(MAX([contains]) AS bit) as 'contains' 
    FROM cte 
    GROUP BY [type]; 

enter image description here

注意的Transact-SQL不具有布爾數據類型;相反它有點類型。請參見聯機叢書>位(Transact-SQL) - https://msdn.microsoft.com/en-gb/library/ms177603.aspx

+0

非常感謝您的解釋 –

+0

我認爲使用cte會降低性能,因爲第二次選擇但奇怪的發生其他原因我不知道爲什麼! –

+1

很高興幫助! :-)我非常喜歡CTE,因爲它們使SQL語句更清晰。查看圖形執行計劃,您應該看到「查詢優化器」並未將CTE視爲單獨的語句。 – RichardCL

1
select sum(counter), type, 
max(case when name like '%value%' then true else false end) as 'Booleanvalue' 
    from T1 
group by type; 

你可以做到這一點爲好,但你可能想要做一個不同的稍後使用CTE或派生表

select sum(counter) over (partition by type order by type), 
     type, 
case when name like '%value%' then true else false end as 'Booleanvalue' 
from table 
+0

非常感謝。將true/false更改爲1/0後,第一種方法適用於我。 –

+1

很高興幫助你 – TheGameiswar

1
WITH cte as 
(
    SELECT counter, type, IIF(name like '%Bassem%', 1, 0) as b 
    FROM #t 
) 
select sum(counter), type, CAST(max(b) as bit) 
    from cte 
    group by type; 
+0

非常感謝你的幫助。 –

0

一個簡單的CASE語句可以完成它。

SELECT SUM(foo.counter) 
     , type 
     , CASE WHEN foo.type = 'type a' THEN 1 ELSE 0 END AS true_false 
FROM (VALUES (1, 'type a'), (2, 'type b')) AS foo(counter, type) 
GROUP BY type; 
+0

我會測試這個解決方案,看看它是如何工作的,因爲這些改變'foo.type like'%type a''和'(0,'type b')'。謝謝 –