2016-04-28 11 views
0

タイトルが明確でない場合は、申し訳ありません。グループ内のcol値に基づいてtrue/falseを選択してください。

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

私はブール値(真/偽)である1つの以上のフィールドを選択したい:私は、私はこのように、タイプ別にグループ化されたカウンタを合計していますシンプルなテーブルT1

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

を持っていますいずれかの名前に特定のテキストが含まれている場合、つまりname like '%Bassem%'の場合はtrueを選択します。しかし、私はグループを使っているので、私はそれを理解できません。

答えて

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ステートメントを理解しやすくなります。 Transact-SQLのは、Booleanデータ型を持っていないことを

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

注意。代わりにビットタイプがあります。書籍のオンライン> bit(Transact-SQL) - https://msdn.microsoft.com/en-gb/library/ms177603.aspx

+0

説明のためにありがとう –

+0

私はcteを使ってパフォーマンスが低下すると思ったが、それは2番目の選択肢があったが、 –

+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

ありがとうございます。真/偽を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のような '%type a''と'(0、' type b ') 'の変更後の動作を確認します。ありがとう –

関連する問題