Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Произведение двух столбцов из разных таблиц. / 20 сообщений из 20, страница 1 из 1
25.09.2018, 13:55
    #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
25.09.2018, 14:04
    #39707699
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Произведение двух столбцов из разных таблиц.
Это в варчарах хранится выражение, которое надо вычислить. или это такой забубённый CSV?
...
Рейтинг: 0 / 0
25.09.2018, 14:14
    #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
25.09.2018, 14:15
    #39707707
Pacifany
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Произведение двух столбцов из разных таблиц.
Храню в nvarchar(max). Я так понял нужно преобразовать сначала, идеи мои иссякли)
...
Рейтинг: 0 / 0
25.09.2018, 14:45
    #39707725
Pacifany
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Произведение двух столбцов из разных таблиц.
court,

Спасибо, все работает!!! Возник вопрос, а можно с помощью этой функции посчитать столбик Dolg в таблице баланс, если нужно узнать сумму общего долга?
...
Рейтинг: 0 / 0
25.09.2018, 14:50
    #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
25.09.2018, 15:20
    #39707756
Pacifany
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Произведение двух столбцов из разных таблиц.
court,

Спасибо большое. Последний вопрос, а как мне вытащить кроме суммы DateReport и Days?
...
Рейтинг: 0 / 0
25.09.2018, 17:26
    #39707899
Pacifany
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Произведение двух столбцов из разных таблиц.
Мне нужно показать, сколько было сформировано резервов по договору “с”(столбец Dogobor) на конец декабря 2014 года, если доля резервов по данному продукту относительно общей суммы резервов составляет 14%; ставку резервирования по данному договору на конец декабря 2014. Показать в одном Окне результатов.(Резерв = Dolg*Stavka).
Научился как находить резерв с помощью функции, а дальше ни как. С подобным заданием не сталкивался никогда((( Буду благодарен за любую помощь.
...
Рейтинг: 0 / 0
25.09.2018, 22:48
    #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
26.09.2018, 01:42
    #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
26.09.2018, 10:10
    #39708206
Pacifany
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Произведение двух столбцов из разных таблиц.
В таблице статистика записей не так много, а в таблице баланс достаточно много. Вы и будете продолжать писать про 1НФ или предложите вариант решения?
...
Рейтинг: 0 / 0
26.09.2018, 15:10
    #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
26.09.2018, 15:17
    #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
26.09.2018, 15:25
    #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
26.09.2018, 15:31
    #39708549
Pacifany
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Произведение двух столбцов из разных таблиц.
court,

Я думаю ABS тут не нужен, просто найти минимальное значение и по нему вывести месяц(формат Date) и сумму резерва за этот месяц.
...
Рейтинг: 0 / 0
26.09.2018, 15:36
    #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
26.09.2018, 15:37
    #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
26.09.2018, 15:44
    #39708566
Pacifany
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Произведение двух столбцов из разных таблиц.
И правда, скобочку упустил, запарился уже. Спасибо вам большое, тема закрыта. Много научился у вас!
...
Рейтинг: 0 / 0
27.09.2018, 12:15
    #39709195
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Произведение двух столбцов из разных таблиц.
courtPacifany,

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

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


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