возможно ли создать группу по запросу с другим фильтром в зависимости от поля?

#ms-access

#ms-access

Вопрос:

Интересно, возможно ли создать группу по запросу с несколькими фильтрами в зависимости от поля :

Вот один пример того, что я хочу сделать :

У меня есть одна таблица tPay :

  ------------- -------------- --------------- ---------- 
| idPay       | PayDate      | Pay           | IsBonus  |
 ------------- -------------- --------------- ---------- 
| 1           | 2018-01-12   | 1000,01       | 0        |
| 2           | 2018-01-26   | 1500,01       | 0        |
| 3           | 2018-01-28   |  100,20       | 1        |
| 4           | 2018-02-04   |  200,55       | 1        |
| 5           | 2018-02-04   | 1200,20       | 0        |
 ------------- -------------- --------------- ---------- 
  

Мне нужно запросить по месяцам общую сумму оплаты, основную выплаченную сумму и бонус:

  ------------- -------------- --------------- ----------------- 
| PayMonth    | TotalPay     | Bonus         | Pay             |
|             | no filter    | isBonus = 1   | isBonus = 0     |
 ------------- -------------- --------------- ----------------- 
| 2018-01     | 2600,22      | 100.22        |  1500,02        |
| 2018-02     | 1400,75      | 200.55        |  1200,55        |
 ------------- -------------- --------------- ----------------- 
  

Возможно ли это сделать в одном запросе или мне нужно выполнить несколько запросов group by?

Мне удается настроить запрос так, чтобы в нем были первые два столбца, но я не знаю, как поступить дальше :

  select DateSerial(Year([PayDate]),Month([PayDate]),1) AS PayMonth, Sum(tPay.Pay) AS TotalPay,
 from tPay
 GROUP BY DateSerial(Year([PayDate]),Month([PayDate]),1);
  

Если у вас есть какие-либо идеи, я буду очень признателен!

Ответ №1:

Рассмотрим это IIf() выражение:

 IIf(tPay.isBonus=1, tPay.Pay, 0)
  

Когда isBonus=1 , выражение возвращает сумму бонуса (выплаты); в противном случае оно возвращает ноль.

Итак, для каждой строки необработанных данных это выражение возвращает значения, которые вы хотите добавить. И чтобы сделать это на GROUP BY уровне, поместите это внутрь Sum() вот так …

 Sum(IIf(tPay.isBonus=1, tPay.Pay, 0)) AS bonus_pay
  

Это должно дать вам то, что вам нужно для третьего столбца. Для последнего столбца используйте аналогичную логику, но измените IIf условие на isBonus=0

Комментарии:

1. Большое спасибо, это именно то, что я искал. Я знал, что есть способ включить условие, но я знал как…

2. @HansUp, наверняка вы согласитесь со всем вашим опытом работы в MS Access, что настало время обновить диалект базы данных до современных стандартов ANSI. Проголосуйте со мной за то, чтобы рекомендовать команде Access обновить свой диалект SQL, такой как переносимый CASE оператор, согласованный LIKE подстановочный знак, менее ограничительные предложения JOIN и ON и многое другое.

Ответ №2:

Немного более упрощенный запрос — это —

 SELECT Format(PayDate, "yyyy-mm")    AS PayMonth,
       Sum(Pay)                      AS TotalPay,
       Sum(Iif(isBonus = 1, Pay, 0)) AS Bonus,
       Sum(Iif(isBonus = 0, Pay, 0)) AS [Pay-notBonus]
FROM   tPay
GROUP  BY Format(PayDate, "yyyy-mm")