我在两周前汇总工资和对工资分组时遇到一些问题。我希望能够对一个查询中显示的从1月15日到16日到EndofMonth的所有薪水求和。
我知道可以使用UNION查询完成此操作,但是UNION查询将总薪水显示在2个单独的列中,我只想要一列薪水总和。
当前UNION
查询:
SELECT EOM([wkd]) AS MonthEnding, D.EMPID, Sum(D.YTDWk1) AS TotalYTDF1, Sum(D.YTDWk2) AS TotalYTDF2
FROM (SELECT EMPID, wkd, SumOfGross AS YTDWk1, 0 AS YTDWk2
FROM qryYTDWK1
UNION
SELECT EMPID, wkd, 0, SumOfGross
FROM qryYTDWK2) AS D LEFT JOIN tblEmp ON D.EMPID = tblEmp.EMPID
GROUP BY EOM([wkd]), D.EMPID
ORDER BY D.EMPID;
返回以下结果:
+-------+-------------+------------+------------+
| EMPID | MonthEnding | Fortnight1 | Fortnight2 |
+-------+-------------+------------+------------+
| 1 | 8/31/19 | 6000 | 2000 |
| 4 | 9/30/19 | 5000 | 3000 |
+-------+-------------+------------+------------+
预期结果:
+-------+-----------------+-------+
| EMPID | FortnightEnding | Gross |
+-------+-----------------+-------+
| 1 | 8/15/19 | 6000 |
| 1 | 8/31/19 | 2000 |
| 4 | 9/15/19 | 5000 |
| 4 | 9/30/19 | 3000 |
+-------+-----------------+-------+
答案 0 :(得分:0)
您可以这样:
runtime error 424
修改:一列:
tmpRiskID = riskTbl.Row.Range("Ref No. ID")
答案 1 :(得分:0)
您可以使用day
函数确定日期是哪月的一半,并使用iif
函数相应地跳转,例如:
iif(day(wkd)<16, <first half of month>, <second half of month>)
然后,您需要计算上述表达式中与<first half of month>
和<second half of month>
对应的适当日期。
为此,我将亲自使用dateserial
函数。
可以使用以下方式计算该月上半月(即第15天)的结束时间:
dateserial(year(wkd), month(wkd), 15)
可以使用以下方法计算该月下半月的结束时间(即该月的最后一天):
dateserial(year(wkd), month(wkd)+1, 0)
即下个月的第0 天。 dateserial
函数非常有用,因为它将始终根据提供的参数来计算有效日期-因此,如果year(wkd) = 2019
和month(wkd)+1 = 13
,则不会返回错误,因为月份号是大于12的dateserial(2019, 13, 0)
将如期返回2019年12月31日。
将以上内容放在一起,我们有FortnightEnding
字段:
iif
(
day(wkd)<16,
dateserial(year(wkd),month(wkd),15),
dateserial(year(wkd),month(wkd)+1,0)
) as FortnightEnding
因此我们可以构建以下SQL:
select
empid,
iif
(
day(wkd)<16,
dateserial(year(wkd),month(wkd),15),
dateserial(year(wkd),month(wkd)+1,0)
) as FortnightEnding,
sum(gross)
from
tblpayroll
group by
empid,
iif
(
day(wkd)<16,
dateserial(year(wkd),month(wkd),15),
dateserial(year(wkd),month(wkd)+1,0)
)
通过相同的计算分组,得出每个组中所有日期的gross
字段的总和。
如果您不想重复计算语句,则可以在子查询中计算分组并将结果汇总到父查询中,例如:
select t.empid, t.FortnightEnding, sum(t.gross)
from
(
select
empid,
iif
(
day(wkd)<16,
dateserial(year(wkd),month(wkd),15),
dateserial(year(wkd),month(wkd)+1,0)
) as FortnightEnding,
gross
from
tblpayroll
) t
group by t.empid, t.FortnightEnding