Избегайте публикации скриншотов ваших данных;Ни у кого не будет желания вводить все данные просто для проверки работы их запросов, и у вас могут остаться только кавалерные типы, такие как я, которые готовы грохнуть запрос в SO и сказать «здесь; это, вероятно, наиболеепуть там, но не проверен; удачи! "
Здесь, это почти всегда, но не проверено;удачи:
SELECT
EMPLOYEENAME,
yr,
SUM(CASE WHEN qtr = 1 THEN taxamt END) as q1,
SUM(CASE WHEN qtr = 2 THEN taxamt END) as q2,
SUM(CASE WHEN qtr = 3 THEN taxamt END) as q3,
SUM(CASE WHEN qtr = 4 THEN taxamt END) as q4
FROM
(
SELECT
EMPLOYEENAME,
yr,
qtr,
CASE
WHEN payytd <= 15000 THEN payqtr * 0.2 --fully taxable amounts
WHEN payytd - 15000 BETWEEN 0 AND payqtr THEN (payqtr - (payytd - 15000)) * 0.2 --partly taxable amounts
ELSE 0 --nontaxable amounts
END as taxamt
FROM
(
SELECT
EMPLOYEENAME,
yr,
qtr,
payqtr,
SUM(payqtr) OVER(PARTITION BY EMPLOYEENAME, yr, qtr ORDER BY yr, qtr ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as payytd
FROM
(
SELECT
EMPLOYEENAME,
EXTRACT(year FROM paydate) a yr,
TRUNC((EXTRACT(month FROM paydate) - 1) / 3) + 1 as qtr,
SUM(wage) as payqtr
FROM PAYROLL
GROUP BY EMPLOYEENAME, EXTRACT(year FROM paydate), TRUNC((EXTRACT(month FROM paydate) - 1) / 3) + 1
) qtrs
) with_ytd
) with_tax
GROUP BY EMPLOYEENAME, yr
Для получения рекомендаций по отладке я рекомендую запускать каждый подзапрос изолированно и проверять, чтобы он возвращал результаты.Я мог бы попытаться свести воедино некоторые из этих подзапросов, но оптимизатор сделает это, и, рассредоточившись так, можно надеяться, легко увидеть, чего мы пытаемся достичь
Запросы по порядку выполняются;
Сгруппируйте все выплаты по кварталам на одного работника, так что мы должны получить один квартал / год на каждого работника и сумму их выплат
Добавить столбец, который суммирует квартальную выплату (порядок по возрастанию,рассмотрим все предыдущие строки в разделе) до начала работы сотрудника / год (раздел)
Выполните некоторую логику в отношении оплаты ytd;если это меньше 15 КБ, вся партия должна облагаться налогом.Если оно больше 15 тыс. (Подразумевается), а остаток от ytd - 15 тыс. (Сумма, не облагаемая налогом) находится между 0 и выплатой в этом квартале, то облагается налогом только часть квартала, поэтому вычтите сумму, не облагаемую налогом, из суммы налога и налога.остальные.Если ytd - 15k больше, чем заработная плата в этом квартале, то какой-то другой квартал был частично обложен налогом с остатком безналоговой надбавки, и этот квартал должен быть полностью освобожден от налогов
Теперь у нас должен быть список сотрудников,годы, кварталы и таксоны.Используйте стандартный сводный шаблон, чтобы превратить его в набор лет, и сотрудники с условным суммированием решат, будет ли сумма налога включена в столбец q1 / 2/3/4
E & OE