两周前的总和和工资

时间:2019-09-25 13:36:35

标签: sql ms-access

我在两周前汇总工资和对工资分组时遇到一些问题。我希望能够对一个查询中显示的从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 |
+-------+-----------------+-------+

2 个答案:

答案 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) = 2019month(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