Сумма и групповая зарплата за две недели - PullRequest
0 голосов
/ 25 сентября 2019

У меня проблемы с суммированием и группировкой заработной платы по двум неделям.Я хочу иметь возможность суммировать все выплаты за период с 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 голосов
/ 25 сентября 2019

Вы можете решить, в какую половину месяца выпадает дата, используя функцию day, и переходите соответственно, используя функцию iif, например:

iif(day(wkd)<16, <first half of month>, <second half of month>)

Затем вам нужно вычислить соответствующие даты, соответствующие <first half of month> и <second half of month> в вышеприведенном выражении.

Для этого я бы лично использовал dateserialfunction.

Конец первой половины месяца (т. е. 15-го дня) можно рассчитать, используя:

dateserial(year(wkd), month(wkd), 15)

Конец второй половины месяца (т. е. последнего днямесяца) можно рассчитать, используя:

dateserial(year(wkd), month(wkd)+1, 0)

То есть день 0 th следующего месяца.Функция dateserial очень полезна тем, что она всегда будет вычислять действительную дату из предоставленных параметров - следовательно, если year(wkd) = 2019 & month(wkd)+1 = 13, то вместо возврата ошибки, поскольку номер месяцабольше 12, dateserial(2019, 13, 0) вернет 31 декабря 2019 года, как и ожидалось.

Собрав все вместе, у нас есть поле 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
0 голосов
/ 25 сентября 2019

Можно так что-то вроде:

SELECT 
    EMPID, 
    Month([wkd]),
    Sum(IIf(Day([wkd]) < 16, [Salary], 0)) As YTDWk1,
    Sum(IIf(Day([wkd]) < 16, 0, [Salary])) As YTDWk2
FROM 
    YourTable
GROUP BY 
    EMPID,
    Month([wkd])

Редактировать : один столбец:

SELECT 
    EMPID, 
    Year([wkd]) & "-" & Month([wkd]) & "-" & IIf(Day([wkd]) < 16, 16, DateSerial(Year([wkd]), Month([wkd]) + 1, 0)) As FortnightEnding,
    Sum([Salary]) As Gross
FROM 
    YourTable
GROUP BY 
    EMPID,
    Year([wkd]) & "-" & Month([wkd]) & "-" & IIf(Day([wkd]) < 16, 16, DateSerial(Year([wkd]), Month([wkd]) + 1, 0))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...