根据组中的col值选​​择true / false

时间:2016-04-28 15:24:36

标签: sql-server

如果标题不清楚,请注意。我有一个简单的表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。

4 个答案:

答案 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];

enter image description here

请注意,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;