0

1 週間に新規のクライアント数と従業員のために戻ってきたクライアント数を調べる必要があります。

従業員が先週持っていたクライアントを見つけるために、次のクエリを実行します。

 SELECT DISTINCT ClientIdNumber FROM Transactions
 WHERE [Date] >= @startDate AND [Date] <= @endDate
 AND EmployeeIdNumber = @employeeIdNumber

クライアントと従業員が以前にやり取りしたことがあるかどうかを調べるには、次のクエリを実行できます。

 IF (
     SELECT COUNT(*) AS n FROM Transactions
     WHERE [Date] < @startDate 
     AND ClientIdNumber = @clientIdNumber 
     AND EmployeeIdNumber = @employeeIdNumber
    ) > 0 
     SELECT 1 
  ELSE SELECT 0

結果セットが次のようになるように、これらのクエリを 1 つに結合したいと考えています。

EmployeeIdNumber - NewClients - ReturningClients

2 つの個別のクエリを使用して、最初の結果セットをループし、2 番目の結果セットを適用する必要がありますが、これはもちろん非常に遅い (そして悪い)

最初のクエリの結果が 2 番目のクエリで必要になるため、理解できませんが、それを行うための賢い方法があると確信しています。

4

2 に答える 2

2

結果セットが「EmployeeIdNumber - NewClients - ReturningClients」のように見えるべきだと言っているのは、私には完全には明らかではありません。EmployeeIdNumberfor everyが新しいクライアントの数と戻ってきたクライアントの数を返すことを意味する場合、これが私の解決策です:

select
    t.EmployeeIdNumber,
    sum(case when t.count_before=0 then 1 else 0 end) as count_new_clients,
    sum(case when t.count_before>0 then 1 else 0 end) as count_returning_clients
from
    (
        select
            ClientIdNumber as ClientIdNumber,
            EmployeeIdNumber as EmployeeIdNumber,
            sum(case when [Date] >= @startDate and [Date] <= @endDate then 1 else 0 end) as count_last_week,
            sum(case when [Date] < @startDate then 1 else 0 end) as count_before
        from Transactions
        group by
            ClientIdNumber,
            EmployeeIdNumber
    ) t
group by
    t.EmployeeIdNumber
having
    t.count_last_week>0;
于 2013-07-30T03:53:26.173 に答える