Начало » Использование СУБД » Microsoft SQL Server » суммировать пропорции, хранящиеся в таблице
суммировать пропорции, хранящиеся в таблице [сообщение #5231] |
Wed, 17 July 2024 22:42 |
kmvp
Сообщений: 1 Зарегистрирован: July 2024
|
Junior Member |
|
|
CREATE TABLE dbo.tab1
(
idrow INT NOT null IDENTITY,
group1 VARCHAR(10) NOT NULL,
c1 NUMERIC(10,2) NOT NULL,
c2 NUMERIC(10,2) NOT NULL
)
GO
INSERT INTO tab1 (
group1, --группа
c1, --числитель (сверху)
c2 --знаменатель (снизу)
)
VALUES
('1', 1, 2),
('1', 2, 1.4),
('1', 3, 5.2),
('2', 1, 0.6),
('2', 4, 0.5),
('2', 3, 0.9)
для хранения пропорций в таблице хранится числитель и знаменатель (для одно группы их может быть несколько)
нужно для каждой группы таких значений получить суммарные значения в том же виде: отдельно числитель и отдельно знаменатель
например, для группы 1 правильный ответ в виде результирующей строки будет таким:
group1 c1 c2
1 36.48 14.56
потому что:
1/2 + 2/1.4 + 3/5.2 = по правилам школьной математики приводим к общему знаменателю = 1 * 1.4 * 5.2 / (2 * 1.4 * 5.2) + 2 * 2 * 5.2 / 1.4 * 2 * 5.2 + 3 * 2 * 1.4 / 5.2 * 2 * 1.4 = (7.28 + 20.8 + 8.4) / 14.56 = 36.48 / 14.56
надеюсь не наделал ошибок при расчете
либо если, скажем, получились в результате значения, которые можно сократить, типа:
group1 c1 c2
1 30 10
то хорошо бы (хотя не обязательно) сократить их и получить:
group1 c1 c2
1 3 1
что то типа наименьший общий делитель (или наибольшее общее кратное, уже со школьных времен забыл)
как такое решить на sql?
я могу наколхозить некрасивый код и решить это, но может есть более удачный вариант?
не знаю, как умножить переменное количество значений, когда их может быть как тут всего 3 или много (вот суммировать потом их просто).
вот так пытался сделать, но это не правильно, т.к. нужно перемножить другие числа, дальше не кумекается:
хотелось бы избежать рекурсивного cte, но если никак, то ок...
SELECT *, t1.c1 * t2.c1
FROM tab1 AS t1
JOIN tab1 AS t2 ON t1.group1 = t2.group1 AND t1.idrow <> t2.idrow
WHERE t1.group1 = '1'
|
|
|
Переход к форуму:
Текущее время: Thu Nov 21 18:26:08 GMT+3 2024
Общее время, затраченное на создание страницы: 0.00748 секунд
|