【发布时间】:2018-12-21 16:01:55
【问题描述】:
最初,我的桌子上有 15 名员工。其中两个姓氏相同。
如果我保留E.MAT_EMP 的选择,它可以正常工作,15 名员工将被选中。
如果我删除它(因为我不想显示它),但行数、名字、姓氏和月份日期除外。它返回给我 14 行而不是 15 行。检查后,它显然是我具有相同姓/名的行之一。
@StartDate date,
@EndDate date
as
begin
Declare @D1 date = @StartDate
Declare @D2 date = @EndDate
Declare @Cols varchar(max) = (Select Stuff((Select ',[' +cast(N as varchar(25))+']' From (Select Top (DateDiff(DAY,@D1,@D2)+1) N=Row_Number() Over (Order By (Select Null)) From master..spt_values n1) A For XML Path ('')),1,1,'') )
Declare @SQL varchar(max) = '
Declare @D1 date = '''+cast(@D1 as varchar(50))+'''
Declare @D2 date = '''+cast(@D2 as varchar(50))+'''
Select ROW_NUMBER() OVER (ORDER BY LastName ASC) as [N°],*
From (
Select E.MAT_EMP, NOM_EMP as [LastName],PRENOM_EMP as [FirstName],
Item = day(d)
,Value =
case when (D between DEBUT_DRC and FIN_DRC) and STATUS_DRC = ''Accepté'' then ''RC''
when (D between DEBUT_DAB and FIN_DAB) and STATUS_DAB = ''Accepté'' then ''ABS''
when (D between DC_DEBUT and DC_FIN) and STATUS_DC = ''Accepté'' then DCon.CODE_TYPE_CONGE
else ''''
end
From
DEMANDE_RECUPERATION DC RIGHT JOIN EMPLOYE E
ON DC.MAT_EMP = E.MAT_EMP
LEFT JOIN DEMANDE_ABSENCE ABS
ON E.MAT_EMP = ABS.MAT_EMP
LEFT JOIN DEMANDE_CONGE DCon
ON E.MAT_EMP = DCon.MAT_EMP
Cross Join (
Select Top (DateDiff(DAY,@D1,@D2)+1) D=DateAdd(DAY,-1+Row_Number() Over (Order By (Select Null)),@D1) From master..spt_values n1
) B
) src
Pivot (max(value) for Item in ('+@Cols+') ) pvt
'
Exec(@SQL)
输出如下:
我的目标是在保留 15 行的同时简单地删除该列。
【问题讨论】:
-
我没有仔细检查,但我相信您的数据透视函数是按所有非聚合列进行的隐式分组(它总是这样做),并且由于聚合,您正在“丢失”一行。
-
如果您从“src”子查询中删除 E.MAT_EMP,那么 PIVOT 将仅按 NOM_EMP 和 PRENOM_EMP 分组。因此,如果相同姓氏和名字的 MAT_EMP 超过 1 个,则可以预期获得的行数更少。无论如何,如果将外部查询中的
[N°],*替换为[N°], [LastName], [FirstName], '+@Cols+'会发生什么 -
@EzLo 这种情况有什么解决办法?
-
@LukStorms 我认为它应该是 ''+@Cols+'' 因为它是 XML。但这不起作用,我得到了列,但是对于代表日子的列,我只得到一个里面有 +@Cols+ 的列。
标签: sql-server