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 '<' ? */
Другие вопросы по тегам