gpt4 book ai didi

sql - 具有分组依据和两行合二为一的复杂 SQL 查询

转载 作者:行者123 更新时间:2023-12-02 00:41:08 25 4
gpt4 key购买 nike

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


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

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

人们会去参加一些事件。他们可以在一次事件中获得普通学分或 super 学分,或两者兼而有之。如果 SuperCredits 列代表在事件中获得的大量 super 学分,则该列为 true,如果它代表正常学分,则为 false。

因此,例如,如果 174 人参加了一个事件,并且他们在该事件中获得了 3 个普通学分和 1 个 super 学分,则将向表中添加以下两行:

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

报告每人一行。该行将显示此人参加的最新事件,以及此人在该事件中获得的普通和 super 积分。

我要求您编写或帮助我编写 SQL 查询以选择数据和 GROUP BY 和 SUM() 等等。 或者,如果这是由于某种原因不可能,以及如何组织我的数据以使其成为可能。


这非常令人困惑,如果您不花时间去弄清楚它,我能理解。我已尝试尽可能地简化它,但如果您试一试并需要澄清,一定要提出任何问题。我会努力弄清楚,但我真的很难过,这是超出我经验的分组......

最佳答案

创建以下内容的查询/ View (假设其名为 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)可能更容易,因为它允许您根据需要简单地对列进行 sum()。

关于sql - 具有分组依据和两行合二为一的复杂 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2509231/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com