Сложный SQL-запрос с группировкой и двумя строками в одном - PullRequest
3 голосов
/ 24 марта 2010

Хорошо, мне нужна помощь. Я обычно довольно хорошо разбираюсь в SQL-запросах, но этот сбивает меня с толку. Кстати, это не домашнее задание, это реальная ситуация в базе данных Access, и я написал требования ниже себя.


Вот мой макет стола. Это в Access 2007, если это имеет значение; Я пишу запрос с использованием SQL.

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

Есть события, на которые люди ходят. Они могут заработать обычные кредиты или супер кредиты, или и то, и другое одновременно. Столбец SuperCredits имеет значение true, если строка представляет количество суперкредитов, заработанных на мероприятии, или false, если он представляет обычные кредиты.

Так, например, если есть событие, которое посещает человек 174, и он получает 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 Ответ

3 голосов
/ 24 марта 2010

Создайте запрос / представление следующего (скажем, его называют 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), поскольку она позволяет просто суммировать () столбцы по мере необходимости.

...