我有一个查询可以正确获取团队数量和活动人数的总和。但是,在一个日期的同一位置可能会有多个事件,所以我试图在一天内获得单个位置所有事件的总人数。 这是我目前使用的查询:
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是当天该地点所有活动中每个团队的所有成员的全部总和。
任何想法都会受到赞赏。
答案 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