powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / SQL-запрос. Вопрос по рекурсии
15 сообщений из 15, страница 1 из 1
SQL-запрос. Вопрос по рекурсии
    #39639509
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!

Есть SQL-запрос, который для каждого ТТ+SKU обращается к предыдущему значению с помощью рекурсии.
SQL-запрос
Код: 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.
53.
54.
55.
56.
57.
58.
DECLARE @Таблица table(		
	[Код ТТ] varchar(8),	
	[Код продукции] varchar(8),
	[Дата] date,
	[Отгрузка] integer,	
	[ID] INTEGER)	
;

INSERT INTO
  @Таблица
VALUES 
('Код ТТ1','SKU1', '01.01.2014', 100, 1),
('Код ТТ1','SKU1', '02.01.2014', 110, 2),
('Код ТТ1','SKU1', '03.02.2014', 120, 3),
('Код ТТ1','SKU1', '04.02.2014', 130, 4),
('Код ТТ1','SKU2', '01.02.2014', 100, 1),
('Код ТТ1','SKU2', '02.02.2014', 110, 2),
('Код ТТ1','SKU2', '03.03.2014', 120, 3),
('Код ТТ1','SKU2', '04.03.2014', 130, 4)
;
WITH
	cte AS (
		SELECT
			*,			
			[Предыдущая отгрузка]=cast(null as integer)
		FROM
			@Таблица
		WHERE
			[ID]  = 1			
	UNION ALL	
		SELECT
			Таб.*,			
			cte.[Отгрузка]	
		FROM
			@Таблица Таб
		inner join
			cte
		ON
			Таб.[ID] = cte.[ID] + 1	
			AND 
			Таб.[Код ТТ] = cte.[Код ТТ]
			AND 
			Таб.[Код продукции] = cte.[Код продукции]
	)

SELECT
	[Код ТТ],	
	[Код продукции],
	[Дата],
	[Отгрузка]	
	[ID],
	[Предыдущая отгрузка]
FROM
	cte
ORDER BY	
	[Код ТТ],
	[Код продукции],
	[ID]


1. Добавляю поле [Предыдущая отгрузка]. Скажите, почему не отображается поле отгрузка?
2. Как сделать так, чтобы для каждого ТТ+SKU
- отбирались с ID = 1, если это не январь
- отбирались с ID = 2, если при ID=1 это январь.

Результат должен быть таким
Код ТТ Код продукции Дата Отгрузка IDПредыдущая отгрузкаКод ТТ1 SKU1 2014-01-01 100 1NULLКод ТТ1 SKU1 2014-01-02 110 2 NULL Код ТТ1 SKU1 2014-02-03 120 3110Код ТТ1 SKU1 2014-02-04 130 4120Код ТТ1 SKU2 2014-02-01 100 1 NULLКод ТТ1 SKU2 2014-02-02 110 2100Код ТТ1 SKU2 2014-03-03 120 3110Код ТТ1 SKU2 2014-03-04 130 4120
...
Рейтинг: 0 / 0
SQL-запрос. Вопрос по рекурсии
    #39639532
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

Так и пиши:
( ID = 1 and Month([Дата])>1) or
( ID = 2 and Month([Дата])=1)
...
Рейтинг: 0 / 0
SQL-запрос. Вопрос по рекурсии
    #39639543
Glebanski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

Что еще за адская ересь с рекурсией, когда LAG просто напрашивается?
Код: sql
1.
2.
3.
4.
5.
select 
	[Код ТТ],		[Код продукции],	[Дата],	[Отгрузка]	,	[ID],
	lag(case when month([Дата]) =1  then NULL else  [Отгрузка] end) over (partition by [Код ТТ],		[Код продукции] order by [Дата]) as [Предыдущая отгрузка]
	from 
	@Таблица



Далее сам
...
Рейтинг: 0 / 0
SQL-запрос. Вопрос по рекурсии
    #39639612
Glebanski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

Я мог ТЗ недопонять, так что возможно надо через LAG номер месяца вытаскивать, а не Отгрузку. И если он равен 1, то занулять поле
...
Рейтинг: 0 / 0
SQL-запрос. Вопрос по рекурсии
    #39639669
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kopellyferzmikk,

Так и пиши:
( ID = 1 and Month([Дата])>1) or
( ID = 2 and Month([Дата])=1)
SQL-Запрос
Код: 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.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
DECLARE @Таблица table(		
	[Код ТТ] varchar(8),	
	[Код продукции] varchar(8),
	[Дата] date,
	[Отгрузка] integer,	
	[ID] INTEGER)	
;

INSERT INTO
  @Таблица
VALUES 
('Код ТТ1','SKU1', '01.01.2014', 100, 1),
('Код ТТ1','SKU1', '02.01.2014', 110, 2),
('Код ТТ1','SKU1', '03.02.2014', 120, 3),
('Код ТТ1','SKU1', '04.02.2014', 130, 4),
('Код ТТ1','SKU2', '01.02.2014', 100, 1),
('Код ТТ1','SKU2', '02.02.2014', 110, 2),
('Код ТТ1','SKU2', '03.03.2014', 120, 3),
('Код ТТ1','SKU2', '04.03.2014', 130, 4),
('Код ТТ2','SKU1', '01.01.2014', 100, 1),
('Код ТТ2','SKU1', '02.01.2014', 110, 2),
('Код ТТ2','SKU1', '03.02.2014', 120, 3),
('Код ТТ2','SKU1', '04.03.2014', 130, 4)
;
WITH
	cte AS (
		SELECT
			*,			
			[Предыдущая отгрузка]=cast(null as integer)
		FROM
			@Таблица
		WHERE
			--[ID]  = 1
			([ID] = 1 and Month([Дата])>1) or ( [ID] = 2 and Month([Дата])=1)
	UNION ALL	
		SELECT
			Таб.*,			
			cte.[Отгрузка]	
		FROM
			@Таблица Таб
		inner join
			cte
		ON
			Таб.[ID] = cte.[ID] + 1	
			AND 
			Таб.[Код ТТ] = cte.[Код ТТ]
			AND 
			Таб.[Код продукции] = cte.[Код продукции]
	)

SELECT
	[Код ТТ],	
	[Код продукции],
	[Дата],
	[Отгрузка]	
	[ID],
	[Предыдущая отгрузка]
FROM
	cte
ORDER BY	
	[Код ТТ],
	[Код продукции],
	[ID]


Выдает такой результат
Код ТТ Код продукции Дата ID Предыдущая отгрузкаКод ТТ1 SKU1 2014-01-02 110 NULLКод ТТ1 SKU1 2014-02-03 120 110Код ТТ1 SKU1 2014-02-04 130 120Код ТТ1 SKU2 2014-02-01 100 NULLКод ТТ1 SKU2 2014-02-02 110 100Код ТТ1 SKU2 2014-03-03 120 110Код ТТ1 SKU2 2014-03-04 130 120Код ТТ2 SKU1 2014-01-02 110 NULLКод ТТ2 SKU1 2014-02-03 120 110Код ТТ2 SKU1 2014-03-04 130 120

Не пойму. Почему вместо поля [ID] отображается отгрузка и самого [ID] нету. Почему так? Как правильно написать?
...
Рейтинг: 0 / 0
SQL-запрос. Вопрос по рекурсии
    #39639670
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Glebanskiferzmikk,

Что еще за адская ересь с рекурсией, когда LAG просто напрашивается?
Код: sql
1.
2.
3.
4.
5.
select 
	[Код ТТ],		[Код продукции],	[Дата],	[Отгрузка]	,	[ID],
	lag(case when month([Дата]) =1  then NULL else  [Отгрузка] end) over (partition by [Код ТТ],		[Код продукции] order by [Дата]) as [Предыдущая отгрузка]
	from 
	@Таблица



Далее сам

Glebanskiferzmikk,

Я мог ТЗ недопонять, так что возможно надо через LAG номер месяца вытаскивать, а не Отгрузку. И если он равен 1, то занулять поле
Есть рабочий код и он большой. Чтобы легко было проблему понять и быстро найти решение - упростил код. А так это продолжение Предыдущее значение вычисляемого поля
...
Рейтинг: 0 / 0
SQL-запрос. Вопрос по рекурсии
    #39639721
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikkНе пойму. Почему вместо поля [ID] отображается отгрузка и самого [ID] нету. Почему так? Как правильно написать?
Запятую пропустил.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT
	[Код ТТ],	
	[Код продукции],
	[Дата],
	[Отгрузка]	,
	[ID],
	[Предыдущая отгрузка]
FROM
...
Рейтинг: 0 / 0
SQL-запрос. Вопрос по рекурсии
    #39639739
LameUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как увидел русские названия колонок и таблицы хотел закрыть топик нафиг сходу.
Сделал усилие над собой, скажи спасибо, что сегодня пятница.

Glebanski тебе правильно все сказал.
Объяснять не буду, надеюсь сам допрешь где у тебя ошибка еще до запроса к твоей таблице.

Код: 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.
DECLARE @t table
(		
	[TTCode] varchar(8),	
	[ProductCode] varchar(8),
	[Date] date,
	[Shipping] integer,	
	[ID] INTEGER
)	


INSERT INTO
  @t
VALUES 
--('Код ТТ1','SKU1', '01.01.2014', 100, 1),
--('Код ТТ1','SKU1', '02.01.2014', 110, 2),
--('Код ТТ1','SKU1', '03.02.2014', 120, 3),
--('Код ТТ1','SKU1', '04.02.2014', 130, 4),
--('Код ТТ1','SKU2', '01.02.2014', 100, 1),
--('Код ТТ1','SKU2', '02.02.2014', 110, 2),
--('Код ТТ1','SKU2', '03.03.2014', 120, 3),
--('Код ТТ1','SKU2', '04.03.2014', 130, 4)

('Код ТТ1','SKU1', '01.01.2014', 100, 1),
('Код ТТ1','SKU1', '01.02.2014', 110, 2),
('Код ТТ1','SKU1', '02.03.2014', 120, 3),
('Код ТТ1','SKU1', '02.04.2014', 130, 4),
('Код ТТ1','SKU2', '02.01.2014', 100, 1),
('Код ТТ1','SKU2', '02.02.2014', 110, 2),
('Код ТТ1','SKU2', '03.03.2014', 120, 3),
('Код ТТ1','SKU2', '03.04.2014', 130, 4)

select *, lag(shipping) over (partition by [TTCode], ProductCode order by date), month(date) monthForChecking
from @t
where month(date) > 1 OR  (month (date) = 1 and ID > 1)
...
Рейтинг: 0 / 0
SQL-запрос. Вопрос по рекурсии
    #39639744
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LameUserКак увидел русские названия колонок и таблицы хотел закрыть топик нафиг сходу.Я специально использую русские буквы, чтобы код легко читался и быстро решение получить.
Сделал усилие над собой, скажи спасибо, что сегодня пятница.Спасибо большое!
Glebanski тебе правильно все сказал.
Объяснять не буду, надеюсь сам допрешь где у тебя ошибка еще до запроса к твоей таблице.Да, разобрал.
...
Рейтинг: 0 / 0
SQL-запрос. Вопрос по рекурсии
    #39639749
Дед-Папыхтет
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
SQL-запрос. Вопрос по рекурсии
    #39639792
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikkLameUserКак увидел русские названия колонок и таблицы хотел закрыть топик нафиг сходу.Я специально использую русские буквы, чтобы код легко читался и быстро решение получить
А какой риск если использовать русские буквы?
...
Рейтинг: 0 / 0
SQL-запрос. Вопрос по рекурсии
    #39639801
LameUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikkferzmikkпропущено...
Я специально использую русские буквы, чтобы код легко читался и быстро решение получить
А какой риск если использовать русские буквы?

Риска нет, it just выглядит funny когда смешиваешь two languages в одном месте.
...
Рейтинг: 0 / 0
SQL-запрос. Вопрос по рекурсии
    #39639805
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LameUserРиска нет


еще как есть :)
Вам просто не доводилось встречать русские буквы посреди английского слова в коде. и наоборот

вот вам пример вполне работающего кода, несмотря на русскую "а" в середине слова.
Код: sql
1.
2.
3.
declare @Vаl int
select @Vаl  = 123
select @Vаl 




и при попытке добавить новые строки без копипаста названия переменной вы вдруг словите Must declare the scalar variable

соответственно, чем чаще приходится переключаться между раскладками, тем выше риск реализовать такое внезапное творчество
...
Рейтинг: 0 / 0
SQL-запрос. Вопрос по рекурсии
    #39639885
LameUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПосетительLameUserРиска нет

вот вам пример вполне работающего кода, несмотря на русскую "а" в середине слова.
Код: sql
1.
declare @Vаl int




Я бы за это публичную люстрацию устраивал :)
А вообще русский язык в кодировании - это автору надо 1с осваивать ^^.
...
Рейтинг: 0 / 0
SQL-запрос. Вопрос по рекурсии
    #39639895
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LameUserА вообще русский язык в кодировании - это автору надо 1с осваивать ^^.Раньше в 1С 8.1 и 8.2 программировал :-)
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / SQL-запрос. Вопрос по рекурсии
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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