我加入了两个表,ACTIVITY(具有PK ACTIVITYID和与活动相关的详细信息),NODE(存储与ACTIVITY相关的NODE)并具有以下示例数据
Year WeekNUM ACTIVITYID NODEID ACTIVITY_HOURS_SPENT
2014 36 A1 N1 1
2014 36 A1 N2 1
2014 36 A1 N3 1
2014 36 A2 NULL 2
2014 36 A3 N1 1.5
2014 36 A3 N2 1.5
2014 37 A4 N1 1
2014 37 A5 N1 1
我必须按周编号汇总所有活动的活动数,节点数和时间。我的问题是我无法获得正确的活动花费一周的时间,因为你可以看到ACTIVITYID在表中重复,如果我使用sum(ACTIVITY_HOURS_SPENT)我会得到8周36,而不是(1 + 2 + 1.5) = 4.5)。是否有任何聚合函数来解决这类问题。我可以通过在ACTIVITY表中按周聚合并再次使用上表汇总除了小时之外的所有内容来解决这个问题,但这对我来说需要花费更多时间和昂贵的操作。我正在寻找另一种方法。
编辑:我这样做。实际的表非常大,ACTIVITYNODE(这将是实际实现中的子查询)是我上面显示的表,它是通过使用ACTIVITY和NODE表进行LEFT JOIN获得的。 ACTIVITYID是ACTIVITY表和NODE表中的主键,存储与每个ACTIVITYID相关的节点(因此一对多关系)。 SELECT t1.YEAR,t1.WeekNUM,t1.[ACTIVITY COUNT],t1.[NODE COUNT],t2.[HOURS]
(SELECT YEAR,WeekNUM, count( distinct (ACTIVITYID) ) as [ACTIVITY COUNT],
count ( distinct ( NODEID) ) as [NODE COUNT] from ACTIVITYANDNODE group by YEAR,WeekNUM) as t1
JOIN
( SELECT YEAR,WeekNUM,SUM(ACTIVITY_HOURS_SPENT) as [HOURS] from ACTIVITY group by YEAR,WeekNUM ) as t2
ON t1.YEAR=t2.YEAR and t1.WeekNUM=t2.WeekNUM