陷入聚合

时间:2014-09-26 08:03:25

标签: sql sql-server

我加入了两个表,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

0 个答案:

没有答案