SQL - как вывести сотрудников, у которых сумма меньше 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
3 ответа
Решение
Вы можете добавить дополнительный фильтр следующим образом:
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
как ты.
Мне кажется, вы написали слишком много "вещей" в своем запросе. Ты видишь, подходит ли это тебе?
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
Хорошо попробуйте это:
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 '<' ? */