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

Есть 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
03.05.2018, 16:38
    #39639532
Kopelly
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос. Вопрос по рекурсии
ferzmikk,

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

Я мог ТЗ недопонять, так что возможно надо через LAG номер месяца вытаскивать, а не Отгрузку. И если он равен 1, то занулять поле
...
Рейтинг: 0 / 0
03.05.2018, 21:42
    #39639669
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос. Вопрос по рекурсии
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
03.05.2018, 21:48
    #39639670
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос. Вопрос по рекурсии
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
04.05.2018, 04:53
    #39639721
Kopelly
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос. Вопрос по рекурсии
ferzmikkНе пойму. Почему вместо поля [ID] отображается отгрузка и самого [ID] нету. Почему так? Как правильно написать?
Запятую пропустил.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT
	[Код ТТ],	
	[Код продукции],
	[Дата],
	[Отгрузка]	,
	[ID],
	[Предыдущая отгрузка]
FROM
...
Рейтинг: 0 / 0
04.05.2018, 07:44
    #39639739
LameUser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос. Вопрос по рекурсии
Как увидел русские названия колонок и таблицы хотел закрыть топик нафиг сходу.
Сделал усилие над собой, скажи спасибо, что сегодня пятница.

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
04.05.2018, 07:59
    #39639744
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос. Вопрос по рекурсии
LameUserКак увидел русские названия колонок и таблицы хотел закрыть топик нафиг сходу.Я специально использую русские буквы, чтобы код легко читался и быстро решение получить.
Сделал усилие над собой, скажи спасибо, что сегодня пятница.Спасибо большое!
Glebanski тебе правильно все сказал.
Объяснять не буду, надеюсь сам допрешь где у тебя ошибка еще до запроса к твоей таблице.Да, разобрал.
...
Рейтинг: 0 / 0
04.05.2018, 08:11
    #39639749
Дед-Папыхтет
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос. Вопрос по рекурсии
...
Рейтинг: 0 / 0
04.05.2018, 09:32
    #39639792
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос. Вопрос по рекурсии
ferzmikkLameUserКак увидел русские названия колонок и таблицы хотел закрыть топик нафиг сходу.Я специально использую русские буквы, чтобы код легко читался и быстро решение получить
А какой риск если использовать русские буквы?
...
Рейтинг: 0 / 0
04.05.2018, 09:41
    #39639801
LameUser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос. Вопрос по рекурсии
ferzmikkferzmikkпропущено...
Я специально использую русские буквы, чтобы код легко читался и быстро решение получить
А какой риск если использовать русские буквы?

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


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

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




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

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

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




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


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