具有group by和两行的复杂SQL查询

时间:2010-03-24 16:01:43

标签: sql ms-access ms-access-2007

好的,我需要帮助。我通常很擅长SQL查询,但这个让我感到困惑。顺便说一下,这不是一个家庭作业,这是Access数据库中的一个真实情况,我自己写下了这些要求。


这是我的表格布局。如果重要的话,它将在Access 2007中出现;我正在使用SQL编写查询。

Id (primary key)
PersonID (foreign key)
EventDate
NumberOfCredits
SuperCredits (boolean)

人们会去参加各种活动。他们可以在一个活动中获得正常学分或超级学分,或两者兼而有之。如果行代表在活动中获得的超级信用数量,则SuperCredits列为true,如果代表正常信用,则为false。

因此,例如,如果有人参加的事件,并且他们在活动中获得3个正常学分和1个超级学分,则会在表格中添加以下两行:

ID PersonID EventDate NumberOfCredits SuperCredits
1  174      1/1/2010  3               false
2  174      1/1/2010  1               true

此人也可能在事件中完成了两个单独的事情,因此一个事件可能有两个以上的列,它可能如下所示:

ID PersonID EventDate NumberOfCredits SuperCredits
1  174      1/1/2010  1               false
2  174      1/1/2010  2               false
3  174      1/1/2010  1               true

现在我们要打印一份报告。以下是报告的栏目:

PersonID
LastEventDate
NumberOfNormalCredits
NumberOfSuperCredits

报告每人一排。该行将显示该人员参加的最新活动,以及该人在该活动中获得的正常和超级学分。

我要问你的是编写或帮我写SQL查询来选择数据和GROUP BY和SUM()以及诸如此类的东西。或者,让我知道这是不是由于某种原因不可能,以及如何组织我的数据以使其成为可能。


这是非常令人困惑的,如果你没有花时间来解决它,我理解。我试图尽可能简化它,但如果你试一试并需要澄清,肯定会问任何问题。我会试着想出来,但我真的很难用它,这超出了我的经验......

1 个答案:

答案 0 :(得分:3)

创建以下内容的查询/视图(比如称为PersonLastEvents):

select PersonId, max(EventDate) as LastEventDate
from Events
group by PersonId

然后,您可以通过以下方式获取所需的数据。我不完全熟悉Access,所以你可能需要修改一些语法,但希望这会给你一个方法。

select l.PersonId, l.LastEventDate, 
  sum(case when e.SuperCredits = 'false' then e.NumberOfCredits end) 
    as NumberOfNormalCredits
  sum(case when e.SuperCredits = 'true' then e.NumberOfCredits end) 
    as NumberOfSuperCredits
from PersonLastEvents l
join Events e on l.PersonId = e.PersonId and l.LastEventDate = l.EventDate
group by l.PersonId, l.LastEventDate

顺便说一下,将表更改为两个数字列(NormalCredits,SuperCredits)可能更容易,因为它允许您根据需要简单地对列进行求和。