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
. 的行
- 不需要像您那样
DISTINCT
和 GROUP 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
我在这里遇到了问题。在 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
. 的行
- 不需要像您那样
DISTINCT
和GROUP 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