SQL - 如何显示总和小于 5000 的员工

SQL - how to display employees that has sum less than 5000

我在这里遇到了问题。在 total_trans_amount 列中,如何检查每个员工的 total_trans_amount 总和并显示总数少于 5000 的员工。根据下图,P0947 总共应该有 5700。我想删除包含 P0947 的三行数据,因为它超过了 5700。请参考我当前的 SQL 查询和下面的图片。

SELECT DISTINCT b
    ,SUM(trans_amount2) AS [total_trans_amount]
    ,adjust_amount
    ,trans_amount2
    ,transaction_order
    ,reimname_en
    ,currency_code
    ,remark
    ,disease
FROM temp_reim_used
WHERE company_code = 'pdc'
    AND reim_code = 'CLNC_NPL'
    AND a = a
    AND b = b
    AND trans_amount != 0
    AND reimbalance_id = reimbalance_id
    AND (
        (created_date >= {d '2017-01-01' }
            AND created_date <= {d '2017-09-23' })
        )
GROUP BY b
    ,reim_code
    ,adjust_amount
    ,trans_amount2
    ,transaction_order
    ,reimname_en
    ,currency_code
    ,remark
    ,disease
HAVING SUM(trans_amount2) > - 6000
ORDER BY b ASC

您可以像这样添加额外的过滤器:

WITH CTE
AS
(
   SELECT b,
     SUM(trans_amount2) as [total_trans_amount]
   FROM temp_reim_used
  where company_code = 'pdc' AND reim_code = 'CLNC_NPL'
  AND a = a AND b = b
  AND trans_amount != 0  AND reimbalance_id = reimbalance_id
  AND ((created_date >= {d '2017-01-01'} AND created_date <= {d '2017-09-23'})) 
   GROUP BY b
)
SELECT 
  b,
  SUM(trans_amount2) as [total_trans_amount], 
  adjust_amount,trans_amount2,transaction_order,
  reimname_en , currency_code, remark, disease
from temp_reim_used
where company_code = 'pdc' AND reim_code = 'CLNC_NPL'
  AND a = a AND b = b
  AND trans_amount != 0  AND reimbalance_id = reimbalance_id
  AND ((created_date >= {d '2017-01-01'} AND created_date <= {d '2017-09-23'})) 
  AND b IN (SELECT b FROM CTE WHERE total_trans_amount >= -5000)
GROUP BY b,reim_code, adjust_amount,trans_amount2,transaction_order, 
reimname_en, currency_code, remark, disease 
having SUM(trans_amount2) >-6000 
order by b asc

这里需要注意的事项:

  • CTE会给你每个b的总金额。所以这三行会给你5700。
  • 条件 AND b IN (SELECT b FROM CTE WHERE total_trans_amount >= -5000) 将只为您提供小于 -5000.
  • 的行
  • 不需要像您那样 DISTINCTGROUP BY

好吧,试试这个:

WITH subSource
AS (
    /* your query here */
    )
    ,subSource2 AS (
    SELECT b
        ,total_trans_amount
        ,adjust_amount
        ,trans_amount2
        ,transaction_order
        ,reimname_en
        ,currency_code
        ,remark
        ,disease
        ,sum(total_trans_amount) OVER (PARTITION BY b /*maybe more?*/) AS tempTotal
    FROM subSource
    )
SELECT b
    ,total_trans_amount
    ,adjust_amount
    ,trans_amount2
    ,transaction_order
    ,reimname_en
    ,currency_code
    ,remark
    ,disease
FROM subSource2
WHERE tempTotal <= 5000 /* or just '<' ? */

在我看来,您在查询中写了太多 "things"。 你能看看这是否适合你吗?

SELECT * 
FROM (
    SELECT b,
        adjust_amount,
        trans_amount,
        SUM(trans_amount) OVER (PARTITION BY b) AS TOTAL_TRANS_AMOUNT
        transaction_order,
        reimname_en, 
        currency_code, 
        remark, 
        disease
    from temp_reim_used
    where company_code = 'pdc' 
        AND reim_code = 'CLNC_NPL'
        AND trans_amount != 0  
        AND reimbalance_id = reimbalance_id
        AND created_date >= {d '2017-01-01'} AND created_date <= {d '2017-09-23'}
    ) X
WHERE   TOTAL_TRANS_AMOUNT>-5000
ORDER BY b