如果标题不清楚,请注意。我有一个简单的表T1
counter int, not null
type nvarchar(250), not null
name nvarchar(50), not null
我总结了按类型分组的计数器,如下所示:
select sum(counter), type
from T1
group by type;
我想再选择一个boolean(true / false)字段,这是任何包含特定文本的名称,即如果name like '%Bassem%'
则选择true。但我无法理解,因为我正在使用group by。
答案 0 :(得分: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];
请注意,Transact-SQL没有布尔数据类型;相反,它有点类型。参见联机丛书> bit(Transact-SQL) - https://msdn.microsoft.com/en-gb/library/ms177603.aspx
答案 1 :(得分: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
答案 2 :(得分: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;
答案 3 :(得分: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;