Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在连接多个表时避免重复_Sql Server - Fatal编程技术网

Sql server 如何在连接多个表时避免重复

Sql server 如何在连接多个表时避免重复,sql-server,Sql Server,该表包含三条记录,见以下临时表: 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,12

该表包含三条记录,见以下临时表:

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
(或)


那么,什么样的查询才能达到我的期望呢?

根据要求,这只是对原始查询的一个小改动

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
id销售人员\u id模块\u Cdoe时间\u输入时间\u输出时间
113524分析下午1:30 1:40
213524照片下午1:30下午1:40
313524调查下午1:30 1:40
413524商品部下午1:30下午1:40

5 12543分析下午3:10pm 3:30pm根据要求,这只是对原始的一个小的扭曲

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
id销售人员\u id模块\u Cdoe时间\u输入时间\u输出时间
113524分析下午1:30 1:40
213524照片下午1:30下午1:40
313524调查下午1:30 1:40
413524商品部下午1:30下午1:40
512543分析3:10pm 3:30pm试着这样做

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
试着这样,

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

您想显示较早的时间还是较晚的时间。最好指定其中一个。如果你不关心它们,你需要它们吗?如果没有,您可以使用groupingI need the later times更新问题以指定此选项,然后更改id以匹配您的期望值中稍后的行output@AlexandarR好的,从原来的一个小扭曲。我看到分析不见了,“锚”现在是照片吗?你想显示早期还是晚期。最好指定其中一个。如果你不关心它们,你需要它们吗?如果没有,您可以使用groupingI need the later times更新问题以指定此选项,然后更改id以匹配您的期望值中稍后的行output@AlexandarR好的,从原来的一个小扭曲。我看到分析不见了,“锚”现在是照片吗?