Member 13250972 Ответов: 1

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


Добрый день,

(Я думаю, что мое решение в разделе "Что я пробовал" на самом деле правильное, но если бы кто-то мог подтвердить, что это было бы потрясающе)

Я пытаюсь определить, как рассчитать, сколько неиспользованных средств остается от невозвратных депозитов, где также могут существовать возвратные депозиты. Операции должны рассматриваться как взятые из невозвращаемых сумм в первую очередь для определения того, какая часть баланса между депонированными возвратными и невозвратными суммами может быть снята.

В таблице ниже, transaction_type_id = 3 не подлежат возврату, а также transaction_type_id = 2 подлежат возврату. В этом случае общий депозит составлял $10.00 возвратных и невозвратных средств. $ 0.34 уже израсходованы, но сначала их следует вычесть из невозвратных депозитов.

Теперь я понимаю, что мы можем просто посмотреть на этот пример и увидеть, что все $5,00 могут быть возвращены, так как не все невозвратные средства были израсходованы, и ни один из возвратных средств не был возвращен. Но мне пришлось удалить много строк для краткости.

В SQL, как я могу определить, сколько невозвратных средств было использовано? то есть, если бы общая сумма расходов составляла $6,50, я должен быть в состоянии показать, что только $3,50 могут быть возвращены.

Просто сделать это математически не получится, потому что может быть гораздо больше израсходовано, чем общая сумма невозвратных депозитов; поэтому я не могу просто сказать, что невозвратные депозиты- это общие расходы. Даты будут играть определенную роль в этом, так как при внесении невозвращаемой суммы расходы исходят из нее в первую очередь, даже если на балансе есть возвратные средства.

Заранее спасибо за любую помощь

сумма transaction_type_id create_date
2.5 3 7/20/18
-0.01 5 7/20/18
-0.01 5 7/22/18
-0.01 5 7/22/18
-0.02 4 7/22/18
-0.02 4 7/22/18
-0.02 4 7/22/18
-0.02 4 7/22/18
-0.01 5 7/22/18
-0.01 5 7/22/18
-0.01 5 7/24/18
-0.01 5 7/24/18
2.5 2 8/2/18
2.5 2 8/2/18
-0.01 5 8/2/18
-0.01 5 8/2/18
-0.01 5 8/2/18
-0.01 5 8/2/18
-0.02 4 8/2/18
-0.01 5 8/2/18
-0.02 4 8/2/18
-0.02 4 8/2/18
-0.02 4 8/2/18
-0.02 4 8/2/18
-0.01 5 8/2/18
-0.01 5 8/2/18
-0.01 5 8/2/18
-0.01 5 8/2/18
2.5 3 8/2/18

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

Я дошел до того, что составил временную таблицу невозвратных депозитов transaction_type_id 3 и затем попытались увидеть, какие операции были бы сделаны из этих средств. но, честно говоря, я совсем заблудился.

Я не ищу кого-то, кто писал бы мои сценарии для меня. Простое языковое объяснение того, как я должен подойти к этому, привело бы меня так же далеко.

Вот попытка, которую я предпринял, но я не совсем уверен, что она отражает то, что я пытаюсь сделать.

DECLARE @user_id as INT
SET @user_id = 8004

SELECT 
	SUM(DZCash) as DZCashClaimed,
	CASE WHEN SUM(DZCash) + SUM(CashExpended) > 0 THEN SUM(DZCash) + SUM(CashExpended) ELSE 0 END as UnusedDZCash,
	SUM(CashDeposited) as CashDeposited,
	SUM(CashExpended) as CashExpended,
	SUM(CashBalance) as CashBalance,
	SUM(CashBalance) - CASE WHEN SUM(DZCash) + SUM(CashExpended) > 0 THEN SUM(DZCash) + SUM(CashExpended) ELSE 0 END as ElligibleAMountForWithdraw
FROM 
	(
		SELECT 
		SUM(amount) as DZCash,
		0 as CashDeposited,
		0 as CashExpended,
		0 CashBalance
		FROM user_wallet_cash 
		WHERE user_id = @user_id
		AND amount > 0 AND transaction_type_id = 3

		UNION

		SELECT 
		0 as DZCash,
		SUM(amount) as CashDeposited,
		0 as CashExpended,
		0 CashBalance
		FROM user_wallet_cash 
		WHERE user_id = @user_id
		AND amount > 0 AND transaction_type_id = 2

		UNION

		SELECT 
		0 as DZCash,
		0 as CashDeposited,
		SUM(amount) as CashExpended,
		0 CashBalance
		FROM user_wallet_cash 
		WHERE user_id = @user_id
		AND amount < 0 AND transaction_type_id IN (4,5)

		UNION

		SELECT 
		0 as DZCash,
		0 as CashDeposited,
		0 as CashExpended,
		SUM(amount) as CashBalance
		FROM user_wallet_cash 
		WHERE user_id = @user_id
	)t

Mehdi Gholam

Начните с четкого определения вашей проблемы (ваш пост трудно понять никому, кроме вас, и вы, похоже, сами заблудились).

Member 13250972

Спасибо, но я чувствую, что достаточно ясно описал проблему; и если бы я не был потерян в том аспекте, который я пытаюсь решить, я бы не размещал вопрос на этом форуме. Тем не менее, я попытаюсь сломать его.

Пользователи могут вносить возвращаемые депозиты в свой user_cash_wallet (user_cash).
Мой сайт может вносить невозвратные депозиты в свой user_cash_wallet (site_cash).
Пользователи могут тратить наличные деньги из своего user_cash_wallet (expended_cash).
Денежные средства, израсходованные из user_cash_wallet, должны быть вычтены из средств site_cash до того, как будут использованы средства user_cash.

Отраженный баланс всегда является user_cash_deposited + site_cash_deposited - expended_cash.

Если пользователь решает, что он хочет снять наличные деньги, которые он внес, мне нужно иметь возможность рассчитать, сколько user_cash остается, определив, сколько site_cash было израсходовано. Если какая-либо сумма site_cash остается неиспользованной, то они должны иметь возможность снять всю сумму депонированного user_cash; в противном случае они должны иметь возможность снять остаток денежных средств, так как все site_cash были использованы.

Пожалуйста, дайте мне знать, если проблема станет более ясной. Я подумал, что мне, возможно, придется подумать о том, когда был депонирован site_cash, но я чувствую, что мое решение правильно - я просто хотел бы получить проверку здравомыслия, чтобы убедиться, что я ничего не пропустил.

Member 13250972

И кстати, мое решение не работает. Как я и подозревал, мне нужно уметь вычислять, основываясь на датах, когда site_cash был депонирован, а expended_cash произошел впоследствии.

Пример:
$2.50 site_cash вносится сайтом на депозит.
Пользователь тратит $0.50, оставляя баланс в размере $2.00 (неиспользуемый site_cash). Из которых $0.00 возвращается.
Пользователь вносит $2.50, оставляя баланс $4.50. Из которых $2.50 возвращается; оставляя $2.00 неиспользованным site_cash.
Пользователь тратит еще $3.00, оставляя баланс в размере $1.50. Из которых $1.50 возвращается, так как сначала используется неиспользованный site_cash в размере $2.00. До этого момента все было правильно.

Вот тут-то все и пошло наперекосяк. Если сайт вносит еще $2.50 site_cash, оставляя баланс $4.00, мой скрипт указывает, что пользователь теперь может снять $2.50, потому что математика рисует $1.00, которые ранее вышли из депозита user_cash из вновь внесенного site_cash, когда только будущие расходы должны выйти из средств site_cash.

Если я только сделал вещи более неясными с этим примером, то я думаю, что я сам по себе.

1 Ответов

Рейтинг:
7

Member 13250972

Извините за кодовый проект, но вы, ребята, 0 на 3 помогаете мне. Может быть, мои проблемы слишком сложны? Я не часто прошу о помощи, но когда я это делаю... вы не просите.

Это в конечном счете то, что я должен был сделать, чтобы определить неиспользуемый site_cash, чтобы рассчитать, сколько наличных средств пользователь может снять.

Он суммирует сумму expended_cash после каждого депозита site_cash (claimed_dz_cash).
Возможно, мне все еще нужно сделать некоторые настройки, но я думаю, что получил их отсюда.

SELECT 
	SUM(unused_dz_cash) as unused_dz_cash
FROM
(
	SELECT 
		SUM(cw.amount) as expended_cash, 
		cw_dz.amount as claimed_dz_cash,
		CASE WHEN cw_dz.amount + SUM(cw.amount) > 0 THEN cw_dz.amount + SUM(cw.amount) 
			ELSE 0 END as unused_dz_cash
	FROM user_wallet_cash cw_dz
		JOIN user_wallet_cash cw WITH (NOLOCK) ON cw_dz.create_date <= cw.create_date
	WHERE
		cw_dz.transaction_type_id = 3 
		AND cw_dz.user_id = @user_id 
		AND cw.transaction_type_id NOT IN (2,3)
		AND cw.user_id = @user_id 
	GROUP BY 
		cw_dz.user_wallet_cash_id,cw_dz.amount
)t