是否可以根据字段使用不同的过滤器进行查询分组?

时间:2019-03-25 16:58:37

标签: 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        |
+-------------+--------------+---------------+-----------------+

是否可以在单个查询中执行此操作,还是必须对多个查询进行分组?

我设法将查询设置为具有前两列,但是我不知道如何继续:

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

如果您有任何想法,我将非常感谢!

2 个答案:

答案 0 :(得分: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 :(得分:0)

更简化的查询是-

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")