我想知道是否有可能根据字段通过几个过滤器进行查询分组:
以下是我要执行的操作之一:
我有一张桌子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);
如果您有任何想法,我将非常感谢!
答案 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")