2016-10-19 4 views
3

UserIdが1回以上リストされている場合は+1し、「新規ユーザー」には+1、それ以外の場合は「返すユーザー」にカウントしなければなりません。ありとあらゆる行の数をカウントします。SQL

私が行っているがあります:

select 
Count(distinct [UserId]) as 'Unique users' 
from [TelemetryData] 
where [DiscountId] = '8CAEA860-6766-43E2-9280-27AFE7FDF82E' and [EventName] = 'DiscountClick' 

/* returning */ 
select 
count(Id) as 'Returning users' 
from [TelemetryData] 
where [DiscountId] = '8CAEA860-6766-43E2-9280-27AFE7FDF82E' and [EventName] = 'DiscountClick' 
group by [UserId] 
having count(Id) > 1 

/* returning */ 
select 
count(*) as 'New users' 
from [TelemetryData] 
where [DiscountId] = '8CAEA860-6766-43E2-9280-27AFE7FDF82E' and [EventName] = 'DiscountClick' 
group by [UserId] 
having count(*) = 1 

を私は「帰国」と「新」のユーザーは、最初のクエリのように、クエリの行の合計NUMERを数える必要があります。どうやってするの?

+0

これは、SQL Serverのコードのように見えるので、私はそのタグを追加しました。 –

答えて

2

これは、2つのレベルの集計で実行できます。あなたが欲しいカウントを取得するためにその情報を使用し、その後、UserIdレベルの数を計算します。

select sum(case when cnt > 1 then 1 else 0 end) as ReturningUsers, 
     sum(case when cnt = 1 then 1 else 0 end) as NewUsers 
from (select UserId, count(*) as cnt 
     from [TelemetryData] 
     where [DiscountId] = '8CAEA860-6766-43E2-9280-27AFE7FDF82E' and [EventName] = 'DiscountClick' 
     group by UserId 
    ) u 
+0

'cnt'が見つかりませんでした。 'ReturningUsers' 和として(ケース= 1そうでなければ、その後1 0 '末端CNT')として 'newusersの' ( \tから選択セレクト和(> 1他次いで1 0 '末端CNT' がケース) \t \t [TelemetryData]から 'CNT' として[ユーザーID]、 \t \t数(*)ここで、[ユーザーIDによって[DiscountId] = '8CAEA860-6766-43E2-9280-27AFE7FDF82E' と[EVENTNAME] = 'DiscountClick' 基] \t) – Nerf

+1

@Nerf全体のクエリを使用します。最後に「u」と – gofr1

+0

ああ。 'u'とは何ですか?私はそれが間違っていると思って削除しました; D – Nerf

関連する問題