Sql server 2008 使用SQL Server 2008中所有重复行的列之和显示表的不同行
有两个表格:Sql server 2008 使用SQL Server 2008中所有重复行的列之和显示表的不同行,sql-server-2008,sum,distinct-values,Sql Server 2008,Sum,Distinct Values,有两个表格: 任务表格: TaskName (PK) AllocationID(PK), TaskName(F.K to TaskName in 'Tasks' Table), UserID( F.K to ID in 'Users' Table), EngineerType( F.K to ID in 'EngineerType' Table), Start Date, End Date, Ho
任务
表格:
TaskName (PK)
AllocationID(PK),
TaskName(F.K to TaskName in 'Tasks' Table),
UserID( F.K to ID in 'Users' Table),
EngineerType( F.K to ID in 'EngineerType' Table),
Start Date,
End Date,
Hours,
Location
任务分配
表:
TaskName (PK)
AllocationID(PK),
TaskName(F.K to TaskName in 'Tasks' Table),
UserID( F.K to ID in 'Users' Table),
EngineerType( F.K to ID in 'EngineerType' Table),
Start Date,
End Date,
Hours,
Location
“用户”表:
ID,
FirstName,
LastName
ID,
Type
“工程师类型”表:
ID,
FirstName,
LastName
ID,
Type
每个任务可以有多个分配。因此,任务名称可以在任务分配表中出现多次。同一任务可以映射到多个用户(UserID)
我需要显示所选任务(作为U.I的输入)、分配给该任务的用户ID、第一次出现的开始日期、第一次出现的结束日期以及所选任务的每个用户的总和(小时)
示例:任务分配
数据:
TaskName UserID TypeId StartDate EndDate Hours Location
Task1 1 11 Feb 5 Feb 7 1 NULL
Task1 1 11 Feb 6 Feb 7 2 NULL
Task1 1 11 Feb 7 Feb 7 3 Onsite
Task1 2 12 Feb 8 Feb 10 4 Offshore
Task1 2 12 Feb 9 Feb 10 5 NULL
Task1 2 12 Feb 10 Feb 10 6 NULL
'EngineerTypes' data :
ID Type
11 Type1
12 Type2
'Users' Data :
ID FirstName
1 Name1
2 Name2
我实现的查询是:
Select TaskAllocation.UserId as UserId,Users.FirstName as Name,
TaskAllocation.EngineerType as TypeId,EngineerTypes.Type as Type,
min(TaskAllocation.StartDate) as AllocationStartDate,
max(TaskAllocation.EndDate) as AllocationEndDate,
sum(TaskAllocation.Hours) as Hours, TaskAllocation.Location
from TaskAllocation join Users on TaskAllocation.UserId=Users.ID
join EngineerTypes on EngineerTypes.ID = TaskAllocation.EngineerType
where TaskAllocation.TaskName = Task1' group by
FirstName,UserId,EngineerType,Type,AllocationStartDate,AllocationEndDate,Hours,
Location,TaskName order by TaskName, UserId
输出:用户ID名称类型ID类型分配开始日期分配结束日期小时位置
1. 126 Name1 11 Type1 2015-11-23 2015-11-25 0.1 NULL
2. 126 Name1 11 Type1 2015-11-24 2015-11-25 0.2 NULL
3. 126 Name1 11 Type1 2015-11-25 2015-11-25 0.3 NULL
4. 127 Name2 12 Type2 2015-11-23 2015-11-25 0.2 NULL
5. 127 Name2 12 Type2 2015-11-24 2015-11-25 0.3 NULL
6. 127 Name2 12 Type2 2015-11-25 2015-11-25 0.4 NULL
你可以试试下面的方法 方法1:
select taskname,
userid,
min(startdate) as'first occurence',
max(enddate) as'last occurence'
,sum(hours)
from t1
group by taskname,userid
方法2:交叉应用
select
distinct taskname,userid,b.*
from t1
cross apply
(select min(startdate) as Firstoccur,max(startdate) as secondocc,sum(hours) as hrs
from t1 t2 where t1.taskname =t2.taskname and t1.userid=t2.userid
group by t2.taskname,t2.userid) b
方法3:
窗口功能
with cte
as
(
select taskname,userid,
min(startdate) over (partition by taskname,userid) as 'first',
max(enddate) over (partition by taskname,userid) as 'second',
sum(hours) over (partition by taskname,userid) as 'hrs',
ROW_NUMBER() over (partition by taskname,userid order by taskname,userid) as rn
from t1
)
select *from cte where rn=1
您好,我尝试了第一种方法,包括联接,但它显示的是重复的行。当您按照taskname、userid分组并根据示例数据应用聚合时,是否可以粘贴output。您不一定会得到重复的结果请查看所实现查询的问题。示例数据、输出应为like且输出不匹配Yes,虽然显示了示例数据输出,但是现在,我需要一些额外的数据与它一起显示。所以我使用了连接。使用联接后,输出不同。现在将在问题中包括其他表格。好的,请尝试设置问题的格式删除不必要的内容删除分配开始日期、结束日期、组中的小时是。移除了它们,它成功了。谢谢!