2016-08-12 40 views
0

表包含三个记录时,看到临时见下表:如何避免重复加入多个表

Declare @TimeStamp table (Id int, SalesMan_ID int, Module_Cdoe varchar(50),Time_In varchar(10),Time_Out varchar(10)) 

Insert into @TimeStamp values 
(1,13524,'Analysis','1:30pm','1:40pm'), 
(2,12543,'Analysis','2:10pm','2:30pm'), 
(3,12543,'Analysis','3:10pm','3:30pm') 


;with cteBase (Seq,Module_Cdoe) as(
    Select 1,'Photo' union all 
    Select 2,'Survey' union all 
    Select 3,'Merchand' 
) 
Select id=Row_Number() over (Order By Time_In,SalesMan_id,Seq) 
     ,SalesMan_id 
     ,b.Module_Cdoe 
     ,Time_In 
     ,Time_Out 
from @TimeStamp A 
Join cteBase B on (A.Module_Cdoe='Analysis') 
Order By 1 

从上面的查询结果是:

id SalesMan_id Module_Cdoe Time_In Time_Out 
1 13524  Photo  1:30pm 1:40pm 
2 13524  Survey  1:30pm 1:40pm 
3 13524  Merchand 1:30pm 1:40pm 
4 12543  Photo  2:10pm 2:30pm 
5 12543  Survey  2:10pm 2:30pm 
6 12543  Merchand 2:10pm 2:30pm 
7 12543  Photo  3:10pm 3:30pm 
8 12543  Survey  3:10pm 3:30pm 
9 12543  Merchand 3:10pm 3:30pm 

但我需要一个像看下面:

id SalesMan_id Module_Cdoe Time_In Time_Out 
1 13524  Photo  1:30pm 1:40pm 
2 13524  Survey  1:30pm 1:40pm 
3 13524  Merchand 1:30pm 1:40pm 
4 12543  Photo  2:10pm 2:30pm 
5 12543  Survey  2:10pm 2:30pm 
6 12543  Merchand 2:10pm 2:30pm 

(OR)

id SalesMan_id Module_Cdoe  Time_In Time_Out 
1 13524  Photo   1:30pm 1:40pm 
2 13524  Survey   1:30pm 1:40pm 
3 13524  Merchand  1:30pm 1:40pm 
4 12543  Photo   3:10pm 3:30pm 
5 12543  Survey   3:10pm 3:30pm 
6 12543  Merchand  3:10pm 3:30pm 

那么什么是查询来实现我的期望?

+0

你想要显示更早次或更晚的时间。更好地指定一个或另一个。如果你不关心他们,你需要他们吗?如果没有,你可以使用分组 – Tanner

+0

我需要更晚的时间 –

+0

更新问题,然后指定这个问题,并更改id的匹配您的预期输出后面的行 – Tanner

回答

1

按照要求,这只是原来的一小捻。

Declare @TimeStamp table (Id int, SalesMan_ID int, Module_Cdoe varchar(50),Time_In varchar(10),Time_Out varchar(10)) 
Insert into @TimeStamp values 
(1,13524,'Analysis','1:30pm','1:40pm'), 
(2,12543,'Analysis','2:10pm','2:30pm'), 
(3,12543,'Analysis','3:10pm','3:30pm') 


;with cteBase (Seq,Module_Cdoe) as(
    Select 0,'Analysis' union all 
    Select 1,'Photo' union all 
    Select 2,'Survey' union all 
    Select 3,'Merchand' 
) 
, cteDistPop as (
    Select Distinct 
      SalesMan_Id 
      ,Time_In = Max(Time_In) 
      ,Time_Out = Max(Time_Out) 
    From @TimeStamp 
    Group By SalesMan_Id 
) 
Select id=Row_Number() over (Order By Time_In,SalesMan_id,Seq) 
     ,SalesMan_id 
     ,b.Module_Cdoe 
     ,Time_In 
     ,Time_Out 
from cteDistPop A 
Cross Join cteBase B 
Order By 1 

返回 - 未在“分析”中输入或输出。无论哪种方式,您可以控制从内部cteBase

id SalesMan_id Module_Cdoe Time_In Time_Out 
1 13524   Analysis  1:30pm 1:40pm 
2 13524   Photo   1:30pm 1:40pm 
3 13524   Survey  1:30pm 1:40pm 
4 13524   Merchand  1:30pm 1:40pm 
5 12543   Analysis  3:10pm 3:30pm <<-- Notice Later Date 
6 12543   Photo   3:10pm 3:30pm 
7 12543   Survey  3:10pm 3:30pm 
8 12543   Merchand  3:10pm 3:30pm 
1

尝试这样,

Declare @TimeStamp table (Id int, SalesMan_ID int, Module_Code 
varchar(50),Time_In varchar(10),Time_Out varchar(10)) 

Insert into @TimeStamp values 
(1,13524,'Analysis','1:30pm','1:40pm'), 
(2,12543,'Analysis','2:10pm','2:30pm'), 
(3,12543,'Analysis','3:10pm','3:30pm') 

首先预计表输出

select *From (
Select Row_Number() over (Order By Time_In,SalesMan_id,Seq) id 
     ,SalesMan_id 
     ,b.Module_Code 
     ,Time_In 
     ,Time_Out 
     ,row_number() over (partition by SalesMan_Id,B.Module_code order by id) as rn 
from @TimeStamp A 
Join (select *from 
(values (1,'Photo'),(2,'Survey'),(3,'Merchand'))cteBase(Seq,Module_Code)) B 
on (A.Module_Code='Analysis'))t 
where rn=1 
Order By 1 

第二预期表输出

select *From (
Select Row_Number() over (Order By Time_In,SalesMan_id,Seq) id 
     ,SalesMan_id 
     ,b.Module_Code 
     ,Time_In 
     ,Time_Out 
     ,row_number() over (partition by SalesMan_Id,B.Module_code order by id desc) as rn 
from @TimeStamp A 
Join (select *from 
(values (1,'Photo'),(2,'Survey'),(3,'Merchand'))cteBase(Seq,Module_Code)) B 
on (A.Module_Code='Analysis'))t 
where rn=1 
Order By 1