Harpreet_125 Ответов: 1

Основываясь на результатах запроса SQL cte, Подсчитайте общее количество нет. Клиентов, оплативших рассрочку платежа


ниже запрос дает мне идентификатор клиента. чего я хочу, так это: я хочу подсчитать общее количество клиентов, которые заплатили рассрочку с этих идентификаторов. есть еще одна таблица, называемая рассрочкой, есть столбец состояния со значениями типа "оплачено" и "не оплачено". мы должны считать из таблицы рассрочки.



declare @nodeid int = '1';
with cte as ( 
select  cust_ID, name,null lnode, null rnode from  user_detail where 
cust_ID = @nodeid 

union all select t.cust_ID,t.name, ISNULL(cte.lnode, CASE WHEN t.joinside = 
0 THEN 1 ELSE 0 END) 
lnode, ISNULL(cte.rnode, CASE WHEN t.joinside = 1 THEN 1 ELSE 0 END) 
rnode from  user_detail t inner join cte on cte.cust_ID = t.parentid )

select cust_id from cte 
where rnode='0'  option (maxrecursion 0)


Что я уже пробовал:

declare @nodeid int = '1';
with cte as ( 
select  cust_ID, name,null lnode, null rnode from  user_detail where 
cust_ID = @nodeid 

union all select t.cust_ID,t.name, ISNULL(cte.lnode, CASE WHEN t.joinside = 
0 THEN 1 ELSE 0 END) 
lnode, ISNULL(cte.rnode, CASE WHEN t.joinside = 1 THEN 1 ELSE 0 END) 
rnode from  user_detail t inner join cte on cte.cust_ID = t.parentid )

select Count(lnode) total_left,Count(status) total_paid from cte c
inner join installments i on c.cust_id=i.cust_id
where rnode='0' and status='paid'
option (maxrecursion 0)


но этот запрос не дает точных результатов.

1 Ответов

Рейтинг:
1

Wendelius

Было бы полезно, если бы вы опубликовали некоторые примеры данных. Но давайте попробуем несколько вариантов.

Если на одного клиента может существовать только один платеж, то для перечисления клиентов с оплатой, возможно, что-то вроде

SELECT c.Cust_Id
FROM user_detail c
INNER JOIN installments i ON i.Cust_Id = c.Cust_Id
WHERE c.Status = 'paid'

Если существует несколько платежей, и одного платежа будет достаточно, то что-то вроде
SELECT c.Cust_Id
FROM user_detail c
WHERE EXISTS (SELECT 1
              FROM installments i 
              WHERE i.Cust_Id = c.Cust_Id
              c.Status = 'paid')

Если все платежи должны быть оплачены то возможно
SELECT c.Cust_Id
FROM user_detail c
WHERE NOT EXISTS (SELECT 1
                  FROM installments i 
                  WHERE i.Cust_Id = c.Cust_Id
                  c.Status = 'not paid')

А если вам нужно общее количество клиентов вы можете изменить предложение SELECT в предыдущих примерах на
SELECT COUNT(*)
...


Maciej Los

5ed!