3

私は SSMS 2008 を使用しており、2 つの異なるイベントに参加しているコンシューマーの数を選択しようとしています。おそらくこれは単純なクエリですが、現在、期待されるカウントが返されていません。これは、私が試したことをよりよく説明する私の T-SQL コードです。

select [Program Quarter], event_name, consumer
from #consumer_initiations
where [Program Quarter] = 1  --and consumer = 'Byrd, Victoria Lynn'
group by [Program Quarter], event_name, consumer
having count (distinct event_name) > 1

したがって、上記のクエリは 0 レコードを返します。次のクエリを実行すると、すべてのレコードが取得されます。

select [Program Quarter], event_name, consumer
from #consumer_initiations
where [Program Quarter] = 1

したがって、これらのレコードのどこに、同じ四半期、同じ人物が存在するかがわかりますが、その人物には 2 つ以上のイベントがあります。では、同じ人が 2 つ以上のイベントに参加した回数をどうやって数えればよいでしょうか?

4

2 に答える 2

3

注:頭のてっぺんからすぐに、これを最適化できると確信しています:

問題を分解します。

  1. 問題の四半期に複数のイベントがある人を見つける
  2. 上記のサブクエリで見つかった各消費者について、プログラム四半期、イベント名、および消費者を取得します

これに続いて、サブクエリは次のようなものです

SELECT DISTINCT Consumer
FROM #consumer_initiations
WHERE Count(event_name) > 1

そして、次のような完全なクエリ:

SELECT [Program Quarter], event_name, consumer   
FROM #consumer_initiations  
WHERE consumer IN (SELECT DISTINCT Consumer
FROM #consumer_initiations
WHERE Count(event_name) > 1)

次に、サブクエリなしでこれを最適化する方法を考えます。

于 2011-09-27T22:14:05.687 に答える
1

あなたの構造を使用して、出力例を生成するデータを作成し、必要に応じてコピーして SSMS に貼り付けました。

declare @consumer_initiations table ([Program Quarter] int null, event_name varchar(100) null, consumer varchar(50) null)
insert into @consumer_initiations ([Program Quarter], event_name, consumer) values (1, 'Event 1', 'Byrd')
insert into @consumer_initiations ([Program Quarter], event_name, consumer) values (1, 'Event 2', 'Plane')
insert into @consumer_initiations ([Program Quarter], event_name, consumer) values (2, 'Event 3', 'Train')
insert into @consumer_initiations ([Program Quarter], event_name, consumer) values (3, 'Event 4', 'Stuff')
insert into @consumer_initiations ([Program Quarter], event_name, consumer) values (1, 'Event 5', 'Plane')

select [Program Quarter], event_name, consumer
from @consumer_initiations
where [Program Quarter] = 1  --and consumer = 'Byrd, Victoria Lynn'
group by [Program Quarter], event_name, consumer
having count
(distinct event_name) > 1

select [Program Quarter], event_name, consumer
from @consumer_initiations
where [Program Quarter] = 1

-- Possibly gets more information than needed

select consumer, [Program Quarter], count(event_name) as event_count
from @consumer_initiations
where [Program Quarter] = 1
group by [Program Quarter], consumer
having COUNT(event_name) > 1 

-- Just displays consumers with more than one event

select consumer, event_count from
(
select [Program Quarter], count(event_name) as event_count, consumer
from @consumer_initiations
where [Program Quarter] = 1
group by [Program Quarter], consumer
having COUNT(event_name) > 1 
) as subq

結果

    Program Quarter event_name                                                                                           consumer
--------------- ---------------------------------------------------------------------------------------------------- --------------------------------------------------

(0 row(s) affected)

Program Quarter event_name                                                                                           consumer
--------------- ---------------------------------------------------------------------------------------------------- --------------------------------------------------
1               Event 1                                                                                              Byrd
1               Event 2                                                                                              Plane
1               Event 5                                                                                              Plane

(3 row(s) affected)

consumer                                           Program Quarter event_count
-------------------------------------------------- --------------- -----------
Plane                                              1               2

(1 row(s) affected)

consumer                                           event_count
-------------------------------------------------- -----------
Plane                                              2

(1 row(s) affected)
于 2011-09-27T22:27:08.397 に答える