Расложить число на сумму 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

→ Ссылка