Расложить число на сумму 3 переменных в SQL
Подскажите пожалуйста, можно ли с помощью SQL разложить число на сумму 3 переменных по следующему условию:
- первая переменная может быть не больше max_cell
- вторая переменная может быть не больше max_cell и не может быть больше первой переменной
- вся оставшиеся сумма находится в третьей переменной
вот псевдокод который я придумал с помощью императивного языка программирования:
number_u:=10;
max_cell:=3;
cell1:=0;
cell2:=0;
cell3:=0;
while (cell1+cell2+cell3)=number_u
if cell1<max_cell then
cell1:=cell1+1;
if cell2<max_cell and cell2<cell1 then
cell2:=cell2+1;
cell2:=cell2+1;
end while;
print cell1;
print cell2;
print cell3;
В итоге должен напечатать:
3
3
4
Можно ли такое сделать с помощью декларативного языка программирования SQL?
Ответы (2 шт):
Автор решения: teran
→ Ссылка
под ваши условия подходит и тройка 1-1-8 и другие, не понятно почему у вас только один вариант ответа.
для sql-server нижеприведенный код
DECLARE @num INT = 10,
@max_cell INT = 3;;
with numbers AS (
SELECT n = 1
UNION ALL
SELECT n + 1
FROM numbers
WHERE n + 1 <= @num
)
SELECT *
FROM numbers as n1, numbers as n2, numbers as n3
WHERE
n1.n + n2.n + n3.n = @num
AND n1.n <= @max_cell
AND n2.n <= @max_cell
генерирует следующий результат
n n n
----------- ----------- -----------
1 1 8
2 1 7
3 1 6
1 2 7
2 2 6
3 2 5
1 3 6
2 3 5
3 3 4
Автор решения: Akina
→ Ссылка
Чисто влоб:
WITH
cte1 AS (SELECT CASE WHEN @max_cell <= @number_u
THEN @max_cell
ELSE @number_u
END AS number1),
cte2 AS (SELECT CASE WHEN @max_cell <= @number_u - number1
THEN @max_cell
ELSE @number_u - number1
END AS number2
FROM cte1)
SELECT number1, number2, @number_u - number1 - number2 number3
FROM cte1
CROSS JOIN cte2;
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=f64556c07812c244418840268a2fb393