嘿,我正在尝试解决这个难题,事实证明这很困难。因此,我有一个包含工资表的数据库,该表显示了雇员全年的每周工资。我正在尝试创建一个视图,该视图显示雇主在一年中的每个季度支付的薪金中的失业保险金。雇主仅按雇员的前15,000美元的收入来支付UI。因此,例如,如果员工在第一季度的收入为20000美元,则雇主只需支付第一季度的UI费率* 15000;剩余的$ 5000被豁免,并且雇主在剩余的季度中不支付UI,因此值将为0。如果员工的收入少于$ 15000,则将UI费率应用于全部金额,直到他们获得$ 15000(通过累加他们的每个季度的收入)。因此,例如,如果某个员工在第一季度赚了9000美元,在第二季度赚了3000美元,然后在第三季度赚了4000美元,则雇主将为整个9000美元支付UI,然后整个3000美元,但是在第三季度,仅按差额支付,因此,由于该员工的收入为16000美元,第三季度,雇主将向用户界面支付1000美元(相差16000美元至15000美元)。
因此实际视图应如下所示:
Employee_Name UIQ1 UIQ2 UIQ3 UIQ4
(值)####
This is a snippet of the table showing some of employee Tim Sariol's earnings
这是我一直在尝试运行的一些代码
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作为开始,但我知道这是错误的,但是我迷路了。我认为需要某种控制流语句,但是我不确定如何将其与嵌套的select语句集成(如果确实需要的话)。如果有人可以向正确的方向推动我,我将不胜感激。感谢您的宝贵时间。
答案 0 :(得分:0)
避免发布您的数据的屏幕截图;没有人会希望只键入所有数据来检查其查询工作,并且可能只剩下像我这样的勇敢类型,他们愿意将查询插入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
有关调试建议,建议您单独运行每个子查询,并检查它是否返回结果。我本可以尝试将其中的一些子查询折叠在一起,但是优化器会做到这一点,并像这样展开,希望可以很容易地看到我们要实现的目标
查询按顺序执行;
将每位员工的所有薪水分成季度,因此我们应获得每em每年四分之一的薪水和他们的薪水之和
添加一列,以汇总到员工/年开始的季度(分区)的季度回报(按日期升序,考虑分区中的所有先前行)
对年初至今的薪水做些逻辑;如果少于15k,则必须全部征税。如果超过15k(暗示),并且剩余的ytd-15k(免税金额)在0和本季度的薪水之间,则该季度薪水的一部分应纳税,因此从薪水和税中减去免税金额其余的部分。如果年初至今-15k高于本季度的薪水,则其他某个季度要用免税津贴的余额部分征税,并且该季度必须完全免税
我们现在应该有一个雇员,年,季度和税额的清单。使用标准的枢轴模式将其转换为一组年份,然后根据条件求和,确定是否在q1 / 2/3/4列中包含税额。
E&OE