powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Интересное задание по SQL
24 сообщений из 24, страница 1 из 1
Интересное задание по SQL
    #39824078
Jonsnow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нужна помощь

Такое задание
Даны два параметра:
@1
@2

Первый параметр это количество чисел
Второй параметр это число, которое с помощью сумму количества чисел получить это число
Например
@1 - 2
@2 - 8

Результат:
1 7
2 6
3 5
4 4
5 3
6 2
7 1
Нужно написать это с помощью MySQL. Мысль такая у меня создать таблицу, которая в зависимости от первого параметра создаёт новые столбцы и заносит туда сразу значения, которые будут удовлетворять результату(8).Но как это сделать. Помогитее!
Либо
@1 - 4
@2 - 10

1 2 3 4
2 3 4 1
3 ..
...
...
Рейтинг: 0 / 0
Интересное задание по SQL
    #39824085
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JonsnowНужно написать это с помощью MySQL.Ну а зачем тогда было в MS SSql тему создавать?

JonsnowМысль такая у меня создать таблицу
Фигня мысль... достаточно обычного CTE.
...
Рейтинг: 0 / 0
Интересное задание по SQL
    #39824112
Jonsnow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Нужно это написать на microsoft sql server management studio перепутал


Можно по подробнее? Пожалуйста
...
Рейтинг: 0 / 0
Интересное задание по SQL
    #39824118
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поковыряться действительно оказалось интересно...

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
set @sum:=10;
set @cnt:=3;

WITH RECURSIVE
cte1 AS (SELECT 1 x
         UNION ALL
         SELECT x+1 FROM cte1 WHERE x < @sum-@cnt+1
		),
cte2 AS (SELECT 1 y
         UNION ALL
         SELECT y+1 FROM cte2 WHERE y < pow(2,@sum-@cnt+1) - 1
		),
cte3 AS (SELECT y
         FROM cte1, cte2
         GROUP BY y
         HAVING @sum = SUM(CASE WHEN y & pow(2, x-1) THEN x ELSE 0 END)
		)
SELECT GROUP_CONCAT(x ORDER BY x)
FROM cte1, cte3
WHERE y & pow(2, x-1)
GROUP BY y
HAVING LENGTH(GROUP_CONCAT(x)) - LENGTH(REPLACE(GROUP_CONCAT(x), ',', '')) = @cnt-1 ;



fiddle

Вот только глубина рекурсии получается офигительная...
...
Рейтинг: 0 / 0
Интересное задание по SQL
    #39824119
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JonsnowНужно это написать на microsoft sql server management studio перепутал
Ааа... ну тады пусть тут остаётся.

Посмотри, разберись, адаптируй, буде не лень. Хотя алгоритм далёк от оптимального.
...
Рейтинг: 0 / 0
Интересное задание по SQL
    #39824129
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaПоковыряться действительно оказалось интересно...

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
set @sum:=10;
set @cnt:=3;

WITH RECURSIVE
cte1 AS (SELECT 1 x
         UNION ALL
         SELECT x+1 FROM cte1 WHERE x < @sum-@cnt+1
		),
cte2 AS (SELECT 1 y
         UNION ALL
         SELECT y+1 FROM cte2 WHERE y < pow(2,@sum-@cnt+1) - 1
		),
cte3 AS (SELECT y
         FROM cte1, cte2
         GROUP BY y
         HAVING @sum = SUM(CASE WHEN y & pow(2, x-1) THEN x ELSE 0 END)
		)
SELECT GROUP_CONCAT(x ORDER BY x)
FROM cte1, cte3
WHERE y & pow(2, x-1)
GROUP BY y
HAVING LENGTH(GROUP_CONCAT(x)) - LENGTH(REPLACE(GROUP_CONCAT(x), ',', '')) = @cnt-1 ;




fiddle

Вот только глубина рекурсии получается офигительная...Как минимум, в MSSQL нет RECURSIVE
Хотя, было бы очень полезно. Упростило бы мучительное разглядывание CTE в поисках рекурсии...
...
Рейтинг: 0 / 0
Интересное задание по SQL
    #39824157
Кесарь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iapКак минимум, в MSSQL нет RECURSIVE
Хотя, было бы очень полезно. Упростило бы мучительное разглядывание CTE в поисках рекурсии...

Вот не могу не поддержать!
...
Рейтинг: 0 / 0
Интересное задание по SQL
    #39824160
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JonsnowAkina,

Нужно это написать на microsoft sql server management studio перепутал


Можно по подробнее? Пожалуйста

скоро иссякнут интересные вопросы
...
Рейтинг: 0 / 0
Интересное задание по SQL
    #39824270
Jonsnow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что делать тогда, если resursive нет? Как быть? Может кто ещё подскажет решение этого задания?
Спасибо, что помогаете, но решение какое т сложноватое на первый взгля:(
...
Рейтинг: 0 / 0
Интересное задание по SQL
    #39824525
Jonsnow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Что делать тогда, не получается?(RECURSIVE
...
Рейтинг: 0 / 0
Интересное задание по SQL
    #39824619
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JonsnowЧто делать тогда, если resursive нет? Как быть? Может кто ещё подскажет решение этого задания?
Спасибо, что помогаете, но решение какое т сложноватое на первый взгля:(С RECURSIVE всё просто - в MSSQL просто его не писать!

В скрипте Akina есть и другие неточности - например, в MSSQL нет функции LENGTH.
Зато есть LEN() и DATALENGTH().
Найдите в микрософтовсом хэлпе. И про рекурсивное CTE - там же.
...
Рейтинг: 0 / 0
Интересное задание по SQL
    #39824640
Jonsnow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iap,

Спасибо большое, сейчас буду пробовать это как-то сделать, а таблицы же создавать тоже нужно ?

Может знаете оптимальное решение какое-нибудь?
...
Рейтинг: 0 / 0
Интересное задание по SQL
    #39824641
Jonsnow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Jonsnow,

Ничего не работает(
...
Рейтинг: 0 / 0
Интересное задание по SQL
    #39824653
Jonsnow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
DECLARE  @sum int 
        ,@cnt int
set @sum=10;
set @cnt=3;
WITH 
cte1 AS (SELECT 1 x
         UNION ALL
         SELECT x+1 FROM cte1 WHERE x < @sum-@cnt+1
		),
cte2 AS (SELECT 1 y
         UNION ALL
         SELECT y+1 FROM cte2 WHERE y < power(2,@sum-@cnt+1) - 1
		),
cte3 AS (SELECT y
         FROM cte1, cte2
         GROUP BY y
         HAVING @sum = SUM(CASE WHEN y & power(2,x-1) THEN x ELSE 0 END)
		)
SELECT GROUP_CONCAT(x ORDER BY x)
FROM cte1, cte3
WHERE y & pow(2, x-1)
GROUP BY y
HAVING LEN(GROUP_CONCAT(x)) - LEN(REPLACE(GROUP_CONCAT(x), ',', '')) = @cnt-1 ;

Jonsnow,


Msg 4145, Level 15, State 1, Line 82
Рядом с "THEN" в контексте, где ожидается условие, указано выражение типа, отличного от логического.
Msg 156, Level 15, State 1, Line 84
Неправильный синтаксис около ключевого слова "ORDER".
...
Рейтинг: 0 / 0
Интересное задание по SQL
    #39824674
Jonsnow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Jonsnow,
ВОТ МОЁ Решение, но оно не практично, так как только для одного случая работает
Код: 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.
32.
33.
34.
35.
36.
CREATE DATABASE zadanie
GO 
USE zadanie
CREATE TABLE sum_cyfr(		
id int not null identity,
par1 int not null,
par2 int not null,
res1 int ,
res2 int ,
)
SELECT * FROM sum_cyfr

CREATE PROCEDURE suma
@par1 int,
@par2 int,
@res1 int,
@res2 int
AS 
BEGIN 
	INSERT INTO sum_cyfr([par1],[par2],[res1],[res2])
	VALUES (@par1,@par2,@res1,@res2);
END
EXECUTE suma 2,8,1,7 
EXECUTE suma 2,8,2,6 
EXECUTE suma 2,8,1,7 
EXECUTE suma 2,8,1,10 
SELECT s.res1+s.res2 as suma FROM sum_cyfr s
WHERE s.res1+s.res2 = s.par2
GROUP BY s.res1,s.res2


id	par1	par2	res1	res2
1	2	8	1	7
2	2	8	1	7
3	2	8	1	10
4	2	8	2	6



Результат
Код: sql
1.
2.
3.
suma
8
8
...
Рейтинг: 0 / 0
Интересное задание по SQL
    #39824770
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JonsnowJonsnow,
ВОТ МОЁ Решение, но оно не практично, так как только для одного случая работает


да, не то слово.
А на кого вы собрались выучиться если не секрет?
...
Рейтинг: 0 / 0
Интересное задание по SQL
    #39824784
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iapКак минимум, в MSSQL нет RECURSIVE
КесарьВот не могу не поддержать!
iapВ скрипте Akina есть и другие неточности - например, в MSSQL нет функции LENGTH.
Зато есть LEN() и DATALENGTH().
Други мои! Товарищ изначально написал, что MySQL. Я делал именно под MySQL - в надежде, что тема будет перенесена. То, что ему таки нужен MS SQL, я увидел лишь после публикации решения для MySQL (что видно по следующему после решения посту, кстати). Что ж вы так прям на меня все набросились-то? Ей-ей, не со зла!

Тем более что вся адаптация и сводится к удалению лишнего с точки зрения SQL Server слова да замене имён функций... ерунда же ж. На алгоритм (и на его "вымороченность", впрочем) это никак не влияет.
...
Рейтинг: 0 / 0
Интересное задание по SQL
    #39824792
Jonsnow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Спасибо большое, вот только когда переделываю до mssql, но высверливаются такие ошибки как
Msg 4145, Level 15, State 1, Line 82
Рядом с "THEN" в контексте, где ожидается условие, указано выражение типа, отличного от логического.
Msg 156, Level 15, State 1, Line 84
Неправильный синтаксис около ключевого слова "ORDER".

Очень благодарен
...
Рейтинг: 0 / 0
Интересное задание по SQL
    #39824804
lion2006
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Jonsnow,

Вот через таблицу решение в "лоб". Чем больше кол-во чисел тем дольше обработка.

declare @icount int, @isum int
declare @step int, @massbegin int, @massend int
declare @str nvarchar(max), @ch nvarchar(max), @pos int, @length int
declare @sql nvarchar(MAX), @colname nvarchar(20), @mass_col nvarchar(max), @mass_sum nvarchar(max)

Set @icount=4
Set @isum=10
Set @step=1
SET @massbegin=1
SET @mass_col=''
SET @mass_sum=''

if (not object_id('tempdb..#tab1') IS NULL)
drop table #tab1

Create table #tab1 (mass_sum int)

While @step<@icount
begin
SET @massbegin=@massbegin*10
SET @massbegin=@massbegin+1
SET @step=@step+1
end
SET @massend=@massbegin*9
Set @step=1

While @step<=@icount
begin
SET @colname='col'+CONVERT(nvarchar(17),@step)
SET @sql = 'Alter Table #tab1 ADD '+@colname+' int'
EXEC (@SQL)
SET @step = @step+1
SET @mass_col=@mass_col+@colname+','
SET @mass_sum=@mass_sum+@colname+'+'
end

SET @mass_col = LEFT(@mass_col,LEN(@mass_col)-1)
SET @mass_sum = LEFT(@mass_sum,LEN(@mass_sum)-1)

While @massbegin<=@massend
begin
SET @str = CONVERT(nvarchar(max),@massbegin)
IF PATINDEX('%0%',@str)=0
begin
SET @length=LEN(@str)
SET @pos=@length
SET @step=1
While @step<@icount
begin
SET @str = STUFF(@str,@pos,0,',')
SET @pos=@pos-1
SET @step=@step+1
end
SET @sql = 'INSERT INTO #tab1(mass_sum,'+@mass_col+') VALUES('+CONVERT(char,@isum)+','+@str+')'
EXEC(@sql)
end
SET @massbegin=@massbegin+1
end

SET @sql='Select * FROM #tab1 WHERE '+@mass_sum+'=mass_sum'
EXEC(@sql)

DROP table #tab1
...
Рейтинг: 0 / 0
Интересное задание по SQL
    #39824816
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Модератор: Так что именно надо: MSSQL или MySQL?
...
Рейтинг: 0 / 0
Интересное задание по SQL
    #39824827
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну если на входе просто числа 0-9 то это просто

Код: 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.
32.
DECLARE 
	@a INT = 2,
	@B INT = 8

;WITH T AS
(
	SELECT A.n + 10*B.n + 100*C.n + 1000*D.n as Value
	FROM (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) A(n),
	     (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) B(n),
	     (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) C(n),
	     (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) D(n)
	WHERE A.n + 10*B.n + 100*C.n + 1000*D.n <= POWER(10,@a)
	
), D AS
(
	SELECT 
	Value,
	   S = 
		V.Value % POWER(10, 1) / POWER(10, 0)
		+ V.Value % POWER(10, 2) / POWER(10, 1)
		+ V.Value % POWER(10, 3) / POWER(10, 2)
		+ V.Value % POWER(10, 4) / POWER(10, 3)
		+ V.Value % POWER(10, 5) / POWER(10, 4)
		+ V.Value % POWER(10, 6) / POWER(10, 5)
		+ V.Value % POWER(10, 7) / POWER(10, 6)
		+ V.Value % POWER(10, 8) / POWER(10, 7)
	FROM T v
) 
SELECT 
	RIGHT('0000000000000000000000'+CAST(Value AS VARCHAR(3)),@a)
FROM D 
WHERE S = @B
...
Рейтинг: 0 / 0
Интересное задание по SQL
    #39824831
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С дубликатами и разделением не заморачивался, для студента и так сойдет.
Код: 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.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
DECLARE @sum INT = 10
DECLARE @count INT = 4
;
DECLARE @numbers TABLE ( [n] INT )
;
WITH
n AS (
  SELECT 
    [n] = 1
  UNION ALL
  SELECT
    [n] = [n] + 1
  FROM
    n
  WHERE
    [n] < @sum - @count
)
INSERT
INTO
  @numbers
SELECT
  *
FROM
  n
;
WITH
c AS (
  SELECT
    [step]  = 1,
    [path]  = CONVERT( VARCHAR(MAX), '_' + CONVERT( VARCHAR(10), n.[n] ) ),
    [sum]   = n.[n]
  FROM
    @numbers n
  UNION ALL
  SELECT
    [step]  = c.[step] + 1,
    [path]  = c.[path] + '_' + CONVERT( VARCHAR(10), n.[n] ),
    [sum]   = c.[sum] + n.[n]
  FROM
    c
    CROSS APPLY @numbers n
  WHERE
    c.[step] < @count
)
SELECT
  *
FROM
  c
WHERE
      [step] = @count
  AND [sum] = @sum
;
...
Рейтинг: 0 / 0
Интересное задание по SQL
    #39824845
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaK,

или проще, можно добавить что бы не все разряды учитывало, но мне лень

Код: 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.
DECLARE 
	@a INT = 4,
	@B INT = 19

;WITH T AS
(
	SELECT 
		Value  = A.n + 10*B.n + POWER(10,2)*C.n + POWER(10,3)*D.n + POWER(10,4)*E.N + POWER(10,5)*F.N
				+ POWER(10,6)*G.N + POWER(10,7)*H.N,	 
		S	= A.n + B.n + C.n + D.n + E.N + F.N + G.N  + H.N
	FROM (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) A(n),
	     (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) B(n),
	     (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) C(n),
	     (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) D(n),
	     (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) E(n),
	     (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) F(n),
	     (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) G(n),
	     (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) H(n)
	WHERE 	
		A.n + 10*B.n + POWER(10,2)*C.n + POWER(10,3)*D.n + POWER(10,4)*E.N + POWER(10,5)*F.N
		+ POWER(10,6)*G.N + POWER(10,7)*H.N <= POWER(10,@a)
) 
SELECT 
	RIGHT(REPLICATE('0',@a)+CAST(Value AS VARCHAR(255)),@a)
FROM T
WHERE S = @B
...
Рейтинг: 0 / 0
Интересное задание по SQL
    #39824953
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JonsnowЧто делать тогда, если resursive нет? Как быть? Может кто ещё подскажет решение этого задания?
Спасибо, что помогаете, но решение какое т сложноватое на первый взгля:(

Один из путей такой: написать в поддержку SQL Server и указать на этот недостаток, они могут даже быстро исправить.
Важно указать, что, мол, очень важная возможность для запросов.
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Интересное задание по SQL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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