将表中的列值相加,包括重复项

时间:2016-03-03 16:53:45

标签: sql sql-server sql-server-2008

我有一张像这样重复的表:

ClassId Name    Days    SpecHours   
1       Jack    250     130
1       Jack    250     130
1       Jack    250     120
2       Mike    300     130
…

我想要的是将非重复项的totalSpecHours相加。我的预期输出是:

ClassId Name    Days    totalSpecHours  
1       Jack    250     250
2       Mike    300     130

我无法计算totalSpecHours。我正在尝试使用类似下面的内容,但是无法正常工作。

totalSpecHours = sum(distinct SpecHours)

我尝试下面的相等,但它也不起作用,但我想我需要这样的东西。如果有人帮忙我很感激。感谢。

totalSpecHours= (sum(X.SpecHours in (select mt.ClassId, mt.SpecHours from myTable mt group by mt.ClassId, mt.SpecHours) as X))

干杯。

编辑:Ty为答案,最正确。第一个答案被选为正确答案。赞赏所有!

5 个答案:

答案 0 :(得分:3)

尝试此查询:

select 
 classID, 
 Name, 
 Days, 
 sum(specHours) as TotalSpecHours 
from 
 (
 select distinct ClassId, Name, Days, SpecHours from myTable )t
  group by classID, Name, Days

<强>逻辑:

我们在内部查询中采用不同的值,然后在这个结果集上我们进行分组并得到总和。 请注意,内部查询仅评估一次,因此没有性能问题。

答案 1 :(得分:2)

不应该这样的工作吗?

SELECT ClassId, Name, Days, SUM(SpecHours) AS totalSpecHours 
FROM (
    SELECT DISTINCT ClassId, Name, Days, SpecHours
    FROM Table 
) outer
GROUP BY ClassId, Name, Days

答案 2 :(得分:0)

使用分组依据:

SELECT ClassId, Name, Days, SUM(totalSpecHours) FROM
(
    SELECT ClassId, Name, Days, SpecHours AS totalSpecHours 
    FROM TableName GROUP BY ClassId, Name, Days, SpecHours
)

答案 3 :(得分:0)

您可以使用CTE(公用表格表达式)

while (doswap= true)

答案 4 :(得分:0)

with cte
as
(
select 
classid,name,days,spechours,row_number() over (partition by classid,name,days,spechours order by spechours) as rn
from yourtable

)
select sum(spechours)
from cte c1
where not exists(select 1 from cte c2 where c1.classid=c2.classid and c1.rn>1)