SQL Sum多行没有Group By

时间:2017-09-14 15:53:03

标签: sql sql-server count sum

我有一个查询可以正确获取团队数量和活动人数的总和。但是,在一个日期的同一位置可能会有多个事件,所以我试图在一天内获得单个位置所有事件的总人数。 这是我目前使用的查询:

SELECT 
loc_name, 
eventDate, 
COUNT(t_ID) as Number_of_Teams, 
SUM(NbrOfPeople) as Number_of_People
FROM tblEventDate
WHERE 
eventID = 1 
and eventDate >='09/01/2013'
GROUP BY loc_name, eventDate
ORDER BY eventDate, loc_name

示例数据集如下所示

loc_name |eventDate |Number_of_Teams |Number_of_people
TCC      |2013-09-04|12              |38
SMF      |2013-09-04|8               |12

但是,此查询只能获取eventID = 1的团队和人员编号。我需要能够获得eventID IN(1,2,3,4,5)的总和(每个最多5个事件)每天的位置),而不必在GROUP BY子句中包含eventID。我有点难过。

我尝试了CASE WHEN表达式,但这需要GROUP BY中的eventID,它最终会像这个数据集一样分离值。

loc_name |eventDate |eventID |Number_of_Teams |Number_of_people
TCC      |2013-09-04|1       |12              |38
TCC      |2013-09-04|2       |9               |22
SMF      |2013-09-04|1       |8               |12
SMF      |2013-09-04|2       |4               |9
SMF      |2013-09-04|3       |13              |31

我也尝试过嵌套SELECT语句,但那是一个非常糟糕的失败。 : - )

最终,我需要一个看起来像的数据集:

loc_name |eventDate |Number_of_Teams |Number_of_people
TCC      |2013-09-04|21              |60
SMF      |2013-09-04|25              |52

请注意,Number_of_Teams是当天所有活动中所有团队的完整计数,Number_of_People是当天该地点所有活动中每个团队的所有成员的全部总和。

任何想法都会受到赞赏。

3 个答案:

答案 0 :(得分:0)

  

看起来好像我的评论已经解决了,但我已经这样做了以防问题是你不知道每个日期的event_id是什么

诀窍是从每个loc_name, eventDate中选择最多5个事件。在这种情况下,我选择具有更多团队的事件。您可以随意添加任何所需的过滤器。

 with cte as ( 
      SELECT *, ROW_NUMBER() OVER (PARTITION BY loc_name, eventDate 
                                   ORDER BY Number_of_Teams DESC) as rn
      FROM tblEventDate
      WHERE eventDate >='09/01/2013'
 )
 SELECT loc_name, 
        eventDate, 
        COUNT(t_ID) as Number_of_Teams, 
        SUM(NbrOfPeople) as Number_of_People
 FROM cte
 WHERE rn <= 5
 GROUP BY loc_name, eventDate
 ORDER BY eventDate, loc_name

答案 1 :(得分:0)

如果是2012+,您可以使用窗函数sum()over()

示例

Select Distinct 
       loc_name
      ,eventDate        = max(eventDate)        over (Partition By loc_name)
      ,Number_of_Teams  = sum(Number_of_Teams)  over (Partition By loc_name)
      ,Number_of_people = sum(Number_of_people) over (Partition By loc_name)
 From  YourTable
 Where eventDate>='2013-09-01'

<强>返回

loc_name    eventDate   Number_of_Teams Number_of_people
SMF         2013-09-04  25              52
TCC         2013-09-04  21              60

答案 2 :(得分:0)

你应该改变你的where子句

SELECT 
loc_name, 
eventDate, 
COUNT(t_ID) as Number_of_Teams, 
SUM(NbrOfPeople) as Number_of_People
FROM tblEventDate
WHERE 
eventID IN (1,2,3,4,5) 
and eventDate >='09/01/2013'
GROUP BY loc_name, eventDate
ORDER BY eventDate, loc_name