Попытка выяснить, как отобразить вычисленные результаты по кварталам - PullRequest
0 голосов
/ 12 декабря 2018

Эй, я пытаюсь понять эту проблему, которая оказывается трудной.Итак, у меня есть база данных, в которой есть таблица заработной платы, которая показывает еженедельную заработную плату сотрудника в течение года.Я пытаюсь создать вид, который показывает взнос по страхованию на случай безработицы, который работодатель выплачивает на зарплату сотрудника за каждый квартал года.Работодатель платит пользовательский интерфейс только на первые $ 15000 заработка работника.Так, например, если работник заработает 20000 долларов в первом квартале, то работодатель будет платить только ставку UI * 15000 за первый квартал;оставшиеся 5000 долларов освобождены, и работодатель не платит пользовательский интерфейс за оставшиеся кварталы, поэтому значения будут равны 0. Если работник заработал менее 15000 долларов, ставка пользовательского интерфейса применяется ко всей сумме, пока он не заработает 15000 долларов (сложив своизаработок за каждый квартал).Так, например, если сотрудник заработал 9000 долларов в 1-м квартале, 3000 долларов во 2-м квартале, а затем 4000 долларов в 3-м квартале, работодатель заплатил бы пользовательский интерфейс в целом за 9000 долларов, а затем за все 3000 долларов, но в 3-м квартале, только на разнице, поэтому, поскольку работник заработал 16000 долларов наQ3, работодатель будет платить UI на 1000 долларов (разница между 16000 и 15000 долларов).

Вот тестовый обзор, показывающий работника и его зарплату за 1-й квартал.Таким образом, Джон Соуза и Уилл Поли, заработавшие более 1 200 долл. США за 1-й квартал, просто применили бы пользовательский интерфейс к первым 15 000 долл. США, которые они заработали за 1-й квартал, а затем не использовали пользовательский интерфейс в последующих кварталах

фактическое представление должно выглядеть следующим образом:

Employee_Name UIQ1 UIQ2 UIQ3 UIQ4

(значение) # # # #

Это фрагмент таблицы, показывающий некоторые иззаработок сотрудника Тима Сариола

Это некоторый код, который я пытался запустить

Create or replace view v6Team4 ("Employee Name", "UI Q1") AS
Select employeename, uiq1 = (case when sum(wage) > 15000 then uiq1 = 0.0156 
* 15000 else uiq1 = select 0.0156 * sum(wage) from payroll
where paydate >= '01/01/2018' and paydate <= '03/31/2018' and sum(wage))
from payroll
group by employeename;

Я попытался сделать это с UIQ1 в качестве начала, и я знаю, что это неправильно, но яЯ потерялся.Я полагаю, что необходим какой-то оператор потока управления, но я не уверен, как интегрировать его с вложенными операторами выбора, если они вообще нужны (и я думаю, что они есть).Если бы кто-то мог подтолкнуть меня в правильном направлении, я был бы очень признателен.Спасибо за ваше время.

1 Ответ

0 голосов
/ 12 декабря 2018

Избегайте публикации скриншотов ваших данных;Ни у кого не будет желания вводить все данные просто для проверки работы их запросов, и у вас могут остаться только кавалерные типы, такие как я, которые готовы грохнуть запрос в 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...