Sql 两周的总工资和团体工资
我在两周前对工资单进行汇总和分组时遇到了一些问题。我希望能够在一次查询中显示从1月1日到15日以及从16日到12月底的所有工资总额 我知道这可以使用联合查询完成,但是联合查询将工资总额显示为两个单独的列。我只希望工资总额有一列 当前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,
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