首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试弄清楚如何按季度显示计算结果

尝试弄清楚如何按季度显示计算结果
EN

Stack Overflow用户
提问于 2018-12-12 14:51:55
回答 1查看 57关注 0票数 0

嘿,我在试着解决这个问题,这个问题被证明是困难的。所以我有一个数据库,它有一个工资表,显示了一名员工一年中每周的工资。我正在尝试创建一个视图,该视图显示雇主在一年中每个季度为员工的工资支付的失业保险缴费。雇主只根据雇员的第一个$15000的收入支付UI。例如,如果雇员在第一季度赚了20000美元,那么雇主只需要为第一季度支付UI rate * 15000;剩余的5,000美元是免税的,并且雇主在剩下的季度不支付UI,所以那里的值将是0。如果员工的收入少于15000美元,UI汇率将应用于整个金额,直到他们收入15000美元为止(通过将他们每个季度的收入相加)。因此,举个例子,如果一个雇员在Q1中赚了9000美元,在Q2中赚了3000美元,然后在Q3中赚了4000美元,那么雇主将支付UI全部9000美元,然后是整个3000美元,但在Q3中,只根据差额,所以由于雇员通过Q3赚取了16000美元,雇主将支付UI 1000美元(16000美元和15000美元之间的差额)。

Here is a testview showing the employee and their salary for the 1st quarter. So John Souza and Will Pauly, having earned more than $20000 for the 1st quarter, would just have UI applied to the first $15000 they earned for that 1st quarter and then no UI for the subsequent quarters

因此,实际视图应该如下所示:

Employee_Name UIQ1 UIQ2 UIQ3 UIQ4

(值)    #  # #  #

This is a snippet of the table showing some of employee Tim Sariol's earnings

这是我一直在尝试运行的代码

代码语言:javascript
复制
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语句集成在一起,如果真的需要这些语句的话(我认为确实需要)。如果有人能把我推向正确的方向,我将不胜感激。耽误您时间,实在对不起。

EN

回答 1

Stack Overflow用户

发布于 2018-12-12 18:22:30

避免发布数据的截图;没有人愿意仅仅为了检查他们的查询工作而键入所有数据,您可能只剩下像我这样的漫不经心的人,他们愿意在SO中输入查询并说“这里;这可能是最好的方式,但没有经过测试;祝您好运!”

在这里,这是最好的方法,但没有经过测试;祝你好运:

代码语言:javascript
复制
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支付的逻辑;如果它小于15k,那么整个批次必须纳税。如果超过15k (隐含),并且ytd - 15k (免税金额)的剩余部分介于0和本季度的薪酬之间,则只有本季度薪酬的一部分应纳税,因此从薪酬中减去免税金额并对其余部分征税。如果ytd - 15k超过了本季度的工资,那么另一个季度将用免税津贴的剩余部分征税,本季度必须完全免税。

我们现在应该有一个雇员、年份、季度和税额的列表。使用标准透视模式将其转换为一组年份和员工,并使用条件求和来决定是否应将税额包括在q1/2/3/4列中

E&OE

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53737526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档