Tsql 需要帮助合并两个sql语句吗
我需要知道有多少客户是新客户,有多少人在一周内回来找员工 为了了解该员工上周拥有哪些客户,我询问:Tsql 需要帮助合并两个sql语句吗,tsql,sql-server-2008-r2,Tsql,Sql Server 2008 R2,我需要知道有多少客户是新客户,有多少人在一周内回来找员工 为了了解该员工上周拥有哪些客户,我询问: SELECT DISTINCT ClientIdNumber FROM Transactions WHERE [Date] >= @startDate AND [Date] <= @endDate AND EmployeeIdNumber = @employeeIdNumber 要了解客户和员工之前是否进行过互动,我可以查询: IF ( SELECT COUNT(*
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
我希望将这些查询合并为一个查询,以便结果集如下所示:
EmployeeIdNumber-新客户-返回客户
使用两个单独的查询,我必须循环第一个结果集并应用第二个结果集,这当然是非常缓慢和糟糕的
我无法理解这一点,因为我需要第二个查询中第一个查询的结果,但我相信有一种聪明的方法可以做到这一点。我不完全清楚您所说的结果集应该看起来像EmployeeIdNumber-NewClients-ReturningClients是什么意思。如果您的意思是希望每个EmployeeIdNumber返回新客户数和返回客户数,那么我的解决方案如下:
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;
我认为最快的方法是:
with cte as (
select distinct
T.EmployeeIdNumber,
T.ClientIdNumber,
case
when exists (
select *
from Transactions as TT
where TT.[Date] < @startDate and TT.ClientIdNumber = T.ClientIdNumber
) then 1
else 0
end as Is_Old
from Transactions as T
where T.[Date] >= @startDate and T.[Date] <= @endDate
)
select
EmployeeIdNumber,
sum(case when Is_Old = 1 then 0 else 1 end) as NewClients,
sum(case when Is_Old = 1 then 1 else 0 end) as ReturningClients
from cte
group by EmployeeIdNumber