powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Произведение двух столбцов из разных таблиц.
20 сообщений из 20, страница 1 из 1
Произведение двух столбцов из разных таблиц.
    #39707685
Pacifany
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня есть 2 таблицы
Balance и Statistica. Приведу также часть записей из этих таблиц.
3 строчки из таблицы Balance(ID , ID_Statistica, DateReport, Dogovor, Dolg):

('29', '12', '20141231', 'a', '100000-3000-3000-3000-3000-3000-3000-3000-3000-3000-3000-3000'),
('30', '12', '20141231', 'b', '100000-1000-1000-1000-1000-1000-1000-1000-1000-1000-1000-1000'),
('31', '12', '20141231', 'c', '200000-10000-10000-10000-10000-10000-10000')

1 строчка из таблицы Statistica (ID,DateReport,Days, Stavka):

('12', '20141231', '16', '0.035*1.15*1.15*1.15*1.15/1.05/1.05/1.05/1.05/1.05/1.05/1.05')

Они связаны по внешнему ключу Balance.ID_Statistica=Statistica.ID. Количество записей более тысячи.
Мне нужно умножить Dolg на Stavka. Dolg и Stavka стал хранить в nvarhar(max). Как это сделать не пойму. Спасибо за помощь.
...
Рейтинг: 0 / 0
Произведение двух столбцов из разных таблиц.
    #39707699
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это в варчарах хранится выражение, которое надо вычислить. или это такой забубённый CSV?
...
Рейтинг: 0 / 0
Произведение двух столбцов из разных таблиц.
    #39707706
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pacifany,

создай в базе вот такую функцию
fnEvalJS
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
/*
нужно будет разрешить OLE Automation:

EXEC sp_configure 'OLE Automation', 1;
RECONFIGURE;
EXEC sp_configure;
*/

create FUNCTION [dbo].[fnEvalJS]
(
	@txt		varchar(4000)		
)
RETURNS varchar(8000) 
as
begin
	declare @Result varchar(8000)
	declare @object int, @object2 int
	declare @hr int

	set @txt='<body><script>document.write(' + @txt + ');</script></body>'

	exec @hr=sp_OACreate 'HTMLfile', @object out
	exec @hr=sp_OAMethod @object, 'write', null, @txt
	exec @hr=sp_OAGetProperty @object, 'body', @object2 out 
	exec @hr=sp_OAGetProperty @object2, 'innerText', @Result out 

	exec @hr=sp_OADestroy @object2
	exec @hr=sp_OADestroy @object
	
	return @Result 
end


и можешь не отбивать себе руки дальше хранить хранить всё в nvarhar-арах :)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
;with Balance (ID , ID_Statistica, DateReport, Dogovor, Dolg) as ( 
	select * from (values
	('29', '12', '20141231', 'a', '100000-3000-3000-3000-3000-3000-3000-3000-3000-3000-3000-3000'),
	('30', '12', '20141231', 'b', '100000-1000-1000-1000-1000-1000-1000-1000-1000-1000-1000-1000'),
	('31', '12', '20141231', 'c', '200000-10000-10000-10000-10000-10000-10000')) as Balance (ID , ID_Statistica, DateReport, Dogovor, Dolg) 
),
Statistica (ID,DateReport,Days, Stavka) as (
	select * from (values
	('12', '20141231', '16', '0.035*1.15*1.15*1.15*1.15/1.05/1.05/1.05/1.05/1.05/1.05/1.05')) as Statistica (ID,DateReport,Days, Stavka)
)

select 
	try_cast([dbo].[fnEvalJS]('('+a.Dolg+')*'+b.Stavka) as float) as xz
from Balance a inner join Statistica b on a.ID_Statistica=b.ID 


xz2914,802376725573871,901664605616090,63183196389
...
Рейтинг: 0 / 0
Произведение двух столбцов из разных таблиц.
    #39707707
Pacifany
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Храню в nvarchar(max). Я так понял нужно преобразовать сначала, идеи мои иссякли)
...
Рейтинг: 0 / 0
Произведение двух столбцов из разных таблиц.
    #39707725
Pacifany
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
court,

Спасибо, все работает!!! Возник вопрос, а можно с помощью этой функции посчитать столбик Dolg в таблице баланс, если нужно узнать сумму общего долга?
...
Рейтинг: 0 / 0
Произведение двух столбцов из разных таблиц.
    #39707730
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PacifanyВозник вопрос, а можно с помощью этой функции посчитать столбик Dolg в таблице баланс, если нужно узнать сумму общего долга?А кто нам может запретить ?! :)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
;with Balance (ID , ID_Statistica, DateReport, Dogovor, Dolg) as ( 
	select * from (values
	('29', '12', '20141231', 'a', '100000-3000-3000-3000-3000-3000-3000-3000-3000-3000-3000-3000'),
	('30', '12', '20141231', 'b', '100000-1000-1000-1000-1000-1000-1000-1000-1000-1000-1000-1000'),
	('31', '12', '20141231', 'c', '200000-10000-10000-10000-10000-10000-10000')) as Balance (ID , ID_Statistica, DateReport, Dogovor, Dolg) 
)

select 
	sum((try_cast([dbo].[fnEvalJS](a.Dolg) as float))) as xz
from Balance a
...
Рейтинг: 0 / 0
Произведение двух столбцов из разных таблиц.
    #39707756
Pacifany
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
court,

Спасибо большое. Последний вопрос, а как мне вытащить кроме суммы DateReport и Days?
...
Рейтинг: 0 / 0
Произведение двух столбцов из разных таблиц.
    #39707899
Pacifany
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне нужно показать, сколько было сформировано резервов по договору “с”(столбец Dogobor) на конец декабря 2014 года, если доля резервов по данному продукту относительно общей суммы резервов составляет 14%; ставку резервирования по данному договору на конец декабря 2014. Показать в одном Окне результатов.(Резерв = Dolg*Stavka).
Научился как находить резерв с помощью функции, а дальше ни как. С подобным заданием не сталкивался никогда((( Буду благодарен за любую помощь.
...
Рейтинг: 0 / 0
Произведение двух столбцов из разных таблиц.
    #39708027
Pacifany
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Решил задачу, завернул в ABS:
Код: sql
1.
2.
3.
4.
5.
6.
7.
select 	 
	ABS (sum((try_cast([dbo].[fnEvalJS]('('+a.Dolg+')*'+b.Stavka) as float) *0.14))) as Rezerv,
	ABS ((try_cast([dbo].[fnEvalJS](b.Stavka) as float))) as Stavka
from Balance a 
inner join Statistica b on a.ID_Statistica=b.ID
where a.Dogovor='c' AND b.DateReport = '20141031'
group by b.Stavka




Один вопрос не закрытый, я пока не могу решить ее. Мне нужно показать минимальную ставку в году, за какой месяц она была(вывести по выборке столбец DateReport) и сумму резерва (Dolg*Stavka). Минимальную ставку я нахожу таким образом:
Код: sql
1.
2.
3.
4.
select 	 
	ABS (sum((try_cast([dbo].[fnEvalJS]('('+a.Dolg+')*'+b.Stavka) as float) *0.14))) as Rezerv,
	ABS (min((try_cast([dbo].[fnEvalJS](b.Stavka) as float))) as Stavka
from Balance a inner join Statistica b on a.ID_Statistica=b.ID



А как по найденной ставки вытащить DataReport и посчитать резерв (Dolg*Stavka) я не могу понять. Вложенным селектом не получается, отдельную функцию писать для этого? Спасибо за помощь!
...
Рейтинг: 0 / 0
Произведение двух столбцов из разных таблиц.
    #39708077
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PacifanyМне нужно показать, сколько было сформировано резервов по договору “с”(столбец Dogobor) на конец декабря 2014 года, если доля резервов по данному продукту относительно общей суммы резервов составляет 14%; ставку резервирования по данному договору на конец декабря 2014. Показать в одном Окне результатов.(Резерв = Dolg*Stavka).
Научился как находить резерв с помощью функции, а дальше ни как. С подобным заданием не сталкивался никогда((( Буду благодарен за любую помощь.

Судя по ID к дате 20141231

Pacifany(ID , ID_Statistica, DateReport, Dogovor, Dolg):
('29', '12', '20141231', 'a', '100000-3000-3000-3000-3000-3000-3000-3000-3000-3000-3000-3000'),

(ID,DateReport,Days, Stavka):
('12', '20141231', '16', '0.035*1.15*1.15*1.15*1.15/1.05/1.05/1.05/1.05/1.05/1.05/1.05')

у вас записей не очень много. Точнее, судя по количеству значений в Dolg у вас это помесячные срезы, коих всего 12 в году. В этом случае с функцией можно жить.

Но чисто FYI: тот, кто проектировал БД не знаком с базовыми (извините за тавтологию) понятиями как работают базы данных. Эти таблицы нарушают первую нормальную форму, поэтому вы и имеете проблему использования ваших значений.
...
Рейтинг: 0 / 0
Произведение двух столбцов из разных таблиц.
    #39708206
Pacifany
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В таблице статистика записей не так много, а в таблице баланс достаточно много. Вы и будете продолжать писать про 1НФ или предложите вариант решения?
...
Рейтинг: 0 / 0
Произведение двух столбцов из разных таблиц.
    #39708526
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PacifanyОдин вопрос не закрытый, я пока не могу решить ее. Мне нужно показать минимальную ставку в году, за какой месяц она была(вывести по выборке столбец DateReport) и сумму резерва (Dolg*Stavka). Минимальную ставку я нахожу таким образом:
Код: sql
1.
2.
3.
4.
select 	 
	ABS (sum((try_cast([dbo].[fnEvalJS]('('+a.Dolg+')*'+b.Stavka) as float) *0.14))) as Rezerv,
	ABS (min((try_cast([dbo].[fnEvalJS](b.Stavka) as float))) as Stavka
from Balance a inner join Statistica b on a.ID_Statistica=b.ID




А как по найденной ставки вытащить DataReport и посчитать резерв (Dolg*Stavka) я не могу понять.
а "сумму резерва (Dolg*Stavka)" за все периоды ?
ты бы не "насиловал" свои повествовательные способности, а примером данных / результата изъяснялся, - лучше бы было всем

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
;with cte as (
	select
		DateReport, 	 
		sum(ABS ((try_cast([dbo].[fnEvalJS]('('+a.Dolg+')*'+b.Stavka) as float) *0.14)))over() as Rezerv,
		ABS (min((try_cast([dbo].[fnEvalJS](b.Stavka) as float))) as Stavka
	from Balance a inner join Statistica b on a.ID_Statistica=b.ID
	group by DateReport)
select top 1 * from cte order by Stavka	
...
Рейтинг: 0 / 0
Произведение двух столбцов из разных таблиц.
    #39708533
Pacifany
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
court,

Извините, сейчас уточню. Мне нужно показать минимальную ставку резерва в году; месяц, в котором была эта ставка; сумму сформированного резерва в этот месяц в одном окне результатов.

Код: sql
1.
2.
3.
select 	 	
	ABS (min((try_cast([dbo].[fnEvalJS](b.Stavka) as float))) as Stavka
from Balance a inner join Statistica b on a.ID_Statistica=b.ID



Так вытягиваю минимальную ставку, а по ней не получается вытянуть дату и сумму резерва.
...
Рейтинг: 0 / 0
Произведение двух столбцов из разных таблиц.
    #39708542
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pacifanycourt,

Извините, сейчас уточню. Мне нужно показать минимальную ставку резерва в году; месяц, в котором была эта ставка; сумму сформированного резерва в этот месяц в одном окне результатов.
значит в этом запросе просто убираешь over() и всё

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
;with cte as (
	select
		DateReport, 	 
		sum(ABS ((try_cast([dbo].[fnEvalJS]('('+a.Dolg+')*'+b.Stavka) as float) *0.14)))over() as Rezerv,
		ABS (min((try_cast([dbo].[fnEvalJS](b.Stavka) as float))) as Stavka
	from Balance a inner join Statistica b on a.ID_Statistica=b.ID
	group by DateReport)
select top 1 * from cte order by Stavka	


DateReport - задаёт день или месяц ?
если это день, то выбирать и группировать по format(DateReport, 'yyyyMM')

и зачем там везде ABS ?
...
Рейтинг: 0 / 0
Произведение двух столбцов из разных таблиц.
    #39708549
Pacifany
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
court,

Я думаю ABS тут не нужен, просто найти минимальное значение и по нему вывести месяц(формат Date) и сумму резерва за этот месяц.
...
Рейтинг: 0 / 0
Произведение двух столбцов из разных таблиц.
    #39708558
Pacifany
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изменил немного ваш запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
with cte as (
	select
		b.DateReport, 	 
		sum((try_cast([dbo].[fnEvalJS]('('+a.Dolg+')*'+b.Stavka) as float))) as Rezerv,
		min((try_cast([dbo].[fnEvalJS](b.Stavka) as float)) as Stavka
	from Balance a inner join Statistica b on a.ID_Statistica=b.ID
	group by b.DateReport)
select top 1 * from cte order by b.Stavka	



не срабатывает, выдает "Неправильный синтаксис около ключевого слова "from".
...
Рейтинг: 0 / 0
Произведение двух столбцов из разных таблиц.
    #39708560
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PacifanyИзменил немного ваш запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
with cte as (
	select
		b.DateReport, 	 
		sum((try_cast([dbo].[fnEvalJS]('('+a.Dolg+')*'+b.Stavka) as float))) as Rezerv,
		min((try_cast([dbo].[fnEvalJS](b.Stavka) as float)) as Stavka
	from Balance a inner join Statistica b on a.ID_Statistica=b.ID
	group by b.DateReport)
select top 1 * from cte order by b.Stavka	




не срабатывает, выдает "Неправильный синтаксис около ключевого слова "from".

ну вы посчитайте скобочки для начала
...
Рейтинг: 0 / 0
Произведение двух столбцов из разных таблиц.
    #39708566
Pacifany
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И правда, скобочку упустил, запарился уже. Спасибо вам большое, тема закрыта. Много научился у вас!
...
Рейтинг: 0 / 0
Произведение двух столбцов из разных таблиц.
    #39709195
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
courtPacifany,

создай в базе вот такую функцию
...

Спасибо, поржал было интересно, кроме шуток.
Я бы распарсил по знакам * и /, ну хотя бы с помощью преобразования в xml, а потом сложил бы логарифмы.
Ну, или написал бы CLR.
Буду знать, что так можно.
:-)
...
Рейтинг: 0 / 0
Произведение двух столбцов из разных таблиц.
    #39709205
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggsterБуду знать, что так можно.Так можно только сисадминам.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Произведение двух столбцов из разных таблиц.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]