Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 两周的总工资和团体工资_Sql_Ms Access - Fatal编程技术网

Sql 两周的总工资和团体工资

Sql 两周的总工资和团体工资,sql,ms-access,Sql,Ms Access,我在两周前对工资单进行汇总和分组时遇到了一些问题。我希望能够在一次查询中显示从1月1日到15日以及从16日到12月底的所有工资总额 我知道这可以使用联合查询完成,但是联合查询将工资总额显示为两个单独的列。我只希望工资总额有一列 当前UNION查询: SELECT EOM([wkd]) AS MonthEnding, D.EMPID, Sum(D.YTDWk1) AS TotalYTDF1, Sum(D.YTDWk2) AS TotalYTDF2 FROM (SELECT EMPID, wkd,

我在两周前对工资单进行汇总和分组时遇到了一些问题。我希望能够在一次查询中显示从1月1日到15日以及从16日到12月底的所有工资总额

我知道这可以使用联合查询完成,但是联合查询将工资总额显示为两个单独的列。我只希望工资总额有一列

当前
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 |
+-------+-----------------+-------+

你可以这样做:

选择
恩皮德,
月份([wkd]),
截至年初至今的金额(IIf(天([wkd])<16,[工资],0),
截至年初至今的总额(IIf(天([wkd])<16,0,[工资])
从…起
你的桌子
分组
恩皮德,
月份([wkd])
编辑:一列:

选择
恩皮德,
年([wkd])和“-”月([wkd])和“-”和IIf(日([wkd])<16,16,日期序列(年([wkd]),月([wkd])+1,0)作为两周结束,
总金额([工资])
从…起
你的桌子
分组
恩皮德,
年([wkd])和“-”月([wkd])和“-”和IIf(日([wkd])<16,16,日期序列(年([wkd]),月([wkd])+1,0))

您可以使用该函数确定日期所在月份的哪一半,并相应地使用该函数进行分支,例如:

iif(day(wkd)<16, <first half of month>, <second half of month>)
下半月月末(即当月最后一天)可使用以下公式计算:

dateserial(year(wkd), month(wkd), 15)
dateserial(year(wkd), month(wkd)+1, 0)
即下个月的第0天。该函数非常有用,因为它总是根据提供的参数计算有效日期-因此,如果
年(wkd)=2019
月(wkd)+1=13
,则不会返回错误,因为月数大于12,
dateserial(2019,13,0)
将如预期的那样返回2019年12月31日

综合以上内容,我们有
双周结束
字段:

iif
(
    day(wkd)<16,
    dateserial(year(wkd),month(wkd),15), 
    dateserial(year(wkd),month(wkd)+1,0)
) as FortnightEnding

为什么数据跨越两个表而不是一个表?它只是一个表。tblPayroll是唯一一个用于初始条目的表,但有两个查询将其分为两个两周,一个从1-15日,另一个从16日到MonthEnd。我清楚地看到
from
后面跟着两个不同的表。
选择EOM([wkd])作为Monthendd.EMPID,Sum(D.YTDWk1)作为TotalYTDF1,Sum(D.YTDWk2)因为从SQL语句的开头缺少TotalYTDF2
,这将提供与union查询相同的结果。我想把所有的薪水用句号分隔在一列。查看预期结果:不客气!如果我的答案充分回答了您的问题,请将答案标记为解决方案(如果您觉得合适,请向上投票),以便其他浏览该网站的人可以看到该问题已解决。如果不确定如何执行此操作,请参阅。谢谢
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)
    )
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