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

Я правильно понимаю, что поле [Цена пред которая используется в расчете] можно смело брать как предыдущая цена?
...
Рейтинг: 0 / 0
Предыдущее значение вычисляемого поля
    #39629003
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

В конечном результате [Цена пред которая используется в расчете] - цена предыдущего шага.
...
Рейтинг: 0 / 0
Предыдущее значение вычисляемого поля
    #39629084
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kopelly,

В конечном итоге не сортируется. Получается надо так писать
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.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
Declare @ДельтаПредел decimal(5,2) = 0.07;
DECLARE @Таблица table(	
	[Клиент] varchar(8),
	[Код юр лица] varchar(12),
	[Код ТТ] varchar(8),	
	[Код продукции] varchar(8),
	[Дата] date,
	[Цена] numeric(8,0)
	)	
;

INSERT INTO
  @Таблица
VALUES 
('Клиент1', 'Код юр лица1', 'Код ТТ1','SKU1', '01.01.2014', 100),
('Клиент1', 'Код юр лица1', 'Код ТТ1','SKU1', '02.01.2014', 80),
('Клиент1', 'Код юр лица1', 'Код ТТ1','SKU1', '03.01.2014', 80),
('Клиент1', 'Код юр лица1', 'Код ТТ1','SKU1', '04.01.2014', 80),
('Клиент1', 'Код юр лица1', 'Код ТТ1','SKU1', '05.01.2014', 100),
('Клиент1', 'Код юр лица1', 'Код ТТ1','SKU1', '06.01.2014', 100),
('Клиент1', 'Код юр лица1', 'Код ТТ1','SKU2', '01.01.2014', 50),
('Клиент1', 'Код юр лица1', 'Код ТТ1','SKU2', '02.01.2014', 100),
('Клиент1', 'Код юр лица1', 'Код ТТ1','SKU2', '03.01.2014', 80),
('Клиент1', 'Код юр лица1', 'Код ТТ1','SKU2', '04.01.2014', 80),
('Клиент1', 'Код юр лица1', 'Код ТТ1','SKU2', '05.01.2014', 100),
('Клиент1', 'Код юр лица1', 'Код ТТ1','SKU2', '06.01.2014', 100),
('Клиент1', 'Код юр лица1', 'Код ТТ2','SKU1', '01.01.2014', 60),
('Клиент1', 'Код юр лица1', 'Код ТТ2','SKU1', '02.01.2014', 100),
('Клиент1', 'Код юр лица1', 'Код ТТ2','SKU1', '03.01.2014', 80),
('Клиент1', 'Код юр лица1', 'Код ТТ2','SKU1', '04.01.2014', 80),
('Клиент1', 'Код юр лица1', 'Код ТТ2','SKU1', '05.01.2014', 100),
('Клиент1', 'Код юр лица1', 'Код ТТ2','SKU1', '06.01.2014', 100);

WITH T AS (
	SELECT
		*,
		--id=ROW_NUMBER()over(order by [Клиент], [Код юр лица], [Код ТТ], [Код продукции], [Дата]) from @Таблица),
		id=ROW_NUMBER()over(Partition by [Клиент], [Код юр лица], [Код ТТ], [Код продукции] order by Convert(datetime,[Дата],104)) from @Таблица),
		cte as (
			select
				*,
				t.Цена as [Цена пред],
				0 as [Маркировка скидки],
				[Цена пред которая используется в расчете]=cast(null as numeric(8,0))
			from
				T
			where
				id=1	
	UNION ALL	
	SELECT
		t.*,
		t.[Цена], 
		CASE
			WHEN (cte.[Цена пред] IS NOT NULL) AND ((t.[Цена]/cte.[Цена пред])-1) <= -@ДельтаПредел THEN
				1
			ELSE
				CASE
					WHEN  ((t.[Цена]/cte.[Цена пред])-1) <= @ДельтаПредел AND cte.[Маркировка скидки] =1 THEN
						1
					ELSE
						0
				END
		END,
		cte.[Цена пред]	
	FROM
		t
	INNER JOIN
		cte
	ON
		t.id=cte.id+1
		AND 
		t.[Клиент]=cte.[Клиент]
		AND 
		t.[Код юр лица]=cte.[Код юр лица]
		AND
		t.[Код ТТ]=cte.[Код ТТ]
		AND
		t.[Код продукции]=cte.[Код продукции])
		
SELECT
	*
FROM
	cte
ORDER BY
	--id
	[Клиент],
	[Код юр лица],
	[Код ТТ],
	[Код продукции],
	Convert(datetime,[Дата],104) 


Или так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
...
ORDER BY	
	[Клиент],
	[Код юр лица],
	[Код ТТ],
	[Код продукции],
	id
...
...
Рейтинг: 0 / 0
Предыдущее значение вычисляемого поля
    #39629153
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kopellyferzmikk,

Код: sql
1.
id=ROW_NUMBER()over(Partition by [Клиент], [Код юр лица], [Код ТТ], [Код продукции] order by  [Дата]) from @Таблица)



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
FROM
		cte
	INNER JOIN
		t
	ON
		t.id=cte.id+1 and 
		t.[Клиент]=cte.[Клиент] and 
		t.[Код юр лица]=cte.[Код юр лица] and 
		t.[Код ТТ]=cte.[Код ТТ] and 
		t.[Код продукции]=cte.[Код продукции]
	and 


KopellyЕще и быстрее будет выполняться
Перевел на рабочий код, только быстрее не стало, а наоборот. Будто где то упустили запись.
...
Рейтинг: 0 / 0
Предыдущее значение вычисляемого поля
    #39629155
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
35 строк - 4 мин 40 сек.
...
Рейтинг: 0 / 0
Предыдущее значение вычисляемого поля
    #39629190
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рабочий код

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.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
Declare @ДельтаПредел decimal(5,2) = 0.07;

WITH
	TempTable1 AS (
	SELECT
		CAST(F1."[Торговые точки].[Клиент].[Клиент].[MEMBER_CAPTION]" AS VARCHAR(20)) AS [Клиент],
		CAST(F1."[Торговые точки].[Код юрлица].[Код юрлица].[MEMBER_CAPTION]" AS VARCHAR(20)) AS [Код юрлица],
		CAST(F1."[Торговые точки].[Код ТТ].[Код ТТ].[MEMBER_CAPTION]" AS VARCHAR(20)) AS [Код ТТ],
		CAST(F1."[Продукция].[Код продукции].[Код продукции].[MEMBER_CAPTION]" AS VARCHAR(20)) AS [Код продукции],	
		CONVERT(nvarchar(10), F1."[Время].[Дата].[Дата].[MEMBER_CAPTION]" , 104) AS [Дата],
		F1."[Measures].[Отгрузки шт]" AS [Отгрузки шт],
		F1."[Measures].[Возвраты шт]" AS [Возвраты шт],
		F1."[Measures].[Реализация шт]" AS [Реализация шт],
		CAST(F1."[Measures].[Отгрузки сумма без НДС]" AS float) AS [Отгрузки сумма без НДС],
		CAST(F1."[Measures].[Цена]"  AS decimal(10,0)) AS [Цена]
		FROM OPENROWSET(
		'MSOLAP',
		'Provider=MSOLAP.3;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=profit;Data Source=...;MDX Compatibility=1;Safety Options=2;MDX Missing Member Mode=Error',
		'WITH
			MEMBER [Measures].[Цена] AS (CASE
				WHEN [Measures].[Отгрузки шт] <>0 THEN
						[Measures].[Отгрузки сумма без НДС] / [Measures].[Отгрузки шт]
				END)
			SELECT
				{[Measures].[Отгрузки шт],
				[Measures].[Возвраты шт],	
				[Measures].[Реализация шт],
				[Measures].[Отгрузки сумма без НДС],
				[Measures].[Цена]}
			ON 0,
			NON EMPTY
				[Торговые точки].[Клиент].[Клиент]*
				[Торговые точки].[Код юрлица].[Код юрлица]*
				[Торговые точки].[Код ТТ].[Код ТТ]*
				[Продукция].[Код продукции].[Код продукции]*
				[Время].[Дата].[Дата]
			ON 1
			FROM
				(SELECT
					([Время].[Месяц].&[2017-01-01T00:00:00]:[Время].[Месяц].&[2017-12-01T00:00:00],					
					,[Продукция].[Код продукции].&[13163]
					,{[Торговые точки].[Код ТТ].&[00008грд]}
					) ON 0 FROM PROFIT)'
		) AS F1
	),

TempTable2 AS (
	SELECT
		[Клиент],
		[Код юрлица],
		[Код ТТ],
		[Код продукции],	
		[Дата],
		[Отгрузки шт],
		[Возвраты шт],
		[Реализация шт],
		[Отгрузки сумма без НДС],
		[Цена],
		Year([Дата]) AS [Год],
		Month ([Дата]) AS [Месяц]
	FROM
		TempTable1
	WHERE		
		NOT([Отгрузки шт] =0)
),

	T as (
	SELECT
		*,
		--id=ROW_NUMBER()over(order by [Клиент], [Код юрлица], [Код ТТ], [Код продукции], Convert(datetime,[Дата],104)) FROM TempTable2 ),
		id=ROW_NUMBER()over(Partition by [Клиент], [Код юрлица], [Код ТТ], [Код продукции] order by  Convert(datetime,[Дата],104)) from TempTable2),
		cte AS (
			SELECT
				*,
				t.[Цена] AS [Цена пред],
				0 AS [Маркировка по пред цене],
				[Цена пред которая используется в расчете]=cast(null as decimal(10,0))
			FROM
				T
			WHERE
				id=1
	UNION ALL	
	SELECT
		t.*,
		t.[Цена], 
		CASE
			WHEN (cte.[Цена пред] IS NOT NULL) AND ((t.Цена/cte.[Цена пред])-1) <= -@ДельтаПредел THEN
				1
			ELSE
				CASE
					WHEN  ((t.[Цена]/cte.[Цена пред])-1) <= @ДельтаПредел AND cte.[Маркировка по пред цене] =1 THEN
						1
					ELSE
						0
				END
		END,
		cte.[Цена пред]
	FROM
		t
	inner join
		cte
	ON
		t.id=cte.id+1
		AND
		t.[Клиент]=cte.[Клиент]
		AND 
		t.[Код юрлица]=cte.[Код юрлица]
		AND 
		t.[Код ТТ]=cte.[Код ТТ]
		AND 
		t.[Код продукции]=cte.[Код продукции]  )

SELECT * FROM cte ORDER BY  [Клиент], [Код юрлица], [Код ТТ], [Код продукции], id

Затрудняюсь его оптимизировать.

Как можно еще оптимизировать или уже никак?
...
Рейтинг: 0 / 0
Предыдущее значение вычисляемого поля
    #39629194
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

через времянку эту свою TempTable1 сделай
А дальше уже ЦТЕ
...
Рейтинг: 0 / 0
Предыдущее значение вычисляемого поля
    #39629202
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
courtferzmikk,

через времянку эту свою TempTable1 сделай
А дальше уже ЦТЕ
Я правильно понимаю, что TempTable1 толкать непосредственно в таблицу базы данных, и потом cte толкать в другую таблицу?
...
Рейтинг: 0 / 0
Предыдущее значение вычисляемого поля
    #39629204
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
courtferzmikk,

через времянку эту свою TempTable1 сделай
А дальше уже ЦТЕ
Даже не так
К этому "месту" твоего кода
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
		cte AS (
			SELECT
				*,
				t.[Цена] AS [Цена пред],
				0 AS [Маркировка по пред цене],
				[Цена пред которая используется в расчете]=cast(null as decimal(10,0))
			FROM
				T
			WHERE
				id=1
	UNION ALL	
.... 


ты должен прийти с "настоящей" (пусть временной) таблицей T (#T)

и, по вкусу, индекс на [Клиент], [Код юр лица], [Код ТТ], [Код продукции], id
...
Рейтинг: 0 / 0
Предыдущее значение вычисляемого поля
    #39629214
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

вот что-то типа этого должно быть
Код: 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.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
Declare @ДельтаПредел decimal(5,2) = 0.07;

--	1
	SELECT
		CAST(F1."[Торговые точки].[Клиент].[Клиент].[MEMBER_CAPTION]" AS VARCHAR(20)) AS [Клиент],
		CAST(F1."[Торговые точки].[Код юрлица].[Код юрлица].[MEMBER_CAPTION]" AS VARCHAR(20)) AS [Код юрлица],
		CAST(F1."[Торговые точки].[Код ТТ].[Код ТТ].[MEMBER_CAPTION]" AS VARCHAR(20)) AS [Код ТТ],
		CAST(F1."[Продукция].[Код продукции].[Код продукции].[MEMBER_CAPTION]" AS VARCHAR(20)) AS [Код продукции],	
		CONVERT(nvarchar(10), F1."[Время].[Дата].[Дата].[MEMBER_CAPTION]" , 104) AS [Дата],
		F1."[Measures].[Отгрузки шт]" AS [Отгрузки шт],
		F1."[Measures].[Возвраты шт]" AS [Возвраты шт],
		F1."[Measures].[Реализация шт]" AS [Реализация шт],
		CAST(F1."[Measures].[Отгрузки сумма без НДС]" AS float) AS [Отгрузки сумма без НДС],
		CAST(F1."[Measures].[Цена]"  AS decimal(10,0)) AS [Цена]

into #TempTable1
		FROM OPENROWSET(
		'MSOLAP',
		'Provider=MSOLAP.3;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=profit;Data Source=...;MDX Compatibility=1;Safety Options=2;MDX Missing Member Mode=Error',
		'WITH
			MEMBER [Measures].[Цена] AS (CASE
				WHEN [Measures].[Отгрузки шт] <>0 THEN
						[Measures].[Отгрузки сумма без НДС] / [Measures].[Отгрузки шт]
				END)
			SELECT
				{[Measures].[Отгрузки шт],
				[Measures].[Возвраты шт],	
				[Measures].[Реализация шт],
				[Measures].[Отгрузки сумма без НДС],
				[Measures].[Цена]}
			ON 0,
			NON EMPTY
				[Торговые точки].[Клиент].[Клиент]*
				[Торговые точки].[Код юрлица].[Код юрлица]*
				[Торговые точки].[Код ТТ].[Код ТТ]*
				[Продукция].[Код продукции].[Код продукции]*
				[Время].[Дата].[Дата]
			ON 1
			FROM
				(SELECT
					([Время].[Месяц].&[2017-01-01T00:00:00]:[Время].[Месяц].&[2017-12-01T00:00:00],					
					,[Продукция].[Код продукции].&[13163]
					,{[Торговые точки].[Код ТТ].&[00008грд]}
					) ON 0 FROM PROFIT)'
		) AS F1

--	2
delete from #TempTable1 where ([Отгрузки шт] =0)

--	3
SELECT
	*,
	id=ROW_NUMBER()over(Partition by [Клиент], [Код юрлица], [Код ТТ], [Код продукции] order by  Convert(datetime,[Дата],104)) 

into #T
		
from TempTable1

--	???
-- CREATE /*CLUSTERED*/ INDEX i1 ON #T ([Клиент], [Код юрлица], [Код ТТ], [Код продукции], id);  

--	4
;with	cte AS (
	SELECT
		*,
		t.[Цена] AS [Цена пред],
		0 AS [Маркировка по пред цене],
		[Цена пред которая используется в расчете]=cast(null as decimal(10,0))
	FROM
		#T t
	WHERE
		id=1

	UNION ALL
		
	SELECT
		t.*,
		t.[Цена], 
		CASE
			WHEN (cte.[Цена пред] IS NOT NULL) AND ((t.Цена/cte.[Цена пред])-1) <= -@ДельтаПредел THEN
				1
			ELSE
				CASE
					WHEN  ((t.[Цена]/cte.[Цена пред])-1) <= @ДельтаПредел AND cte.[Маркировка по пред цене] =1 THEN
						1
					ELSE
						0
				END
		END,
		cte.[Цена пред]
	FROM
		#T t
	inner join
		cte
	ON
		t.id=cte.id+1
		AND
		t.[Клиент]=cte.[Клиент]
		AND 
		t.[Код юрлица]=cte.[Код юрлица]
		AND 
		t.[Код ТТ]=cte.[Код ТТ]
		AND 
		t.[Код продукции]=cte.[Код продукции]  )

SELECT * FROM cte ORDER BY  [Клиент], [Код юрлица], [Код ТТ], [Код продукции], id

...
Рейтинг: 0 / 0
Предыдущее значение вычисляемого поля
    #39629225
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
courtты должен прийти с "настоящей" (пусть временной) таблицей T (#T)

и, по вкусу, индекс на [Клиент], [Код юр лица], [Код ТТ], [Код продукции], id
Смысл использовать временную таблицу, если есть табличные переменные TempTable1 и cte? Неужели такой подход значительно увеличит время выгрузки, если используем рекурсию? Только вот такие временные таблицы я еще не создавал, следовательно, затрудняюсь в понимании как их делать.
...
Рейтинг: 0 / 0
Предыдущее значение вычисляемого поля
    #39629227
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
courtferzmikk,

вот что-то типа этого должно быть

Я правильно понимаю, что нужны еще отдельные запросы по созданию таких временных таблиц? Или в базе данных ничего создавать не нужно и базу данных якобы не трогаем?
...
Рейтинг: 0 / 0
Предыдущее значение вычисляемого поля
    #39629231
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikkcourtты должен прийти с "настоящей" (пусть временной) таблицей T (#T)

и, по вкусу, индекс на [Клиент], [Код юр лица], [Код ТТ], [Код продукции], id
Смысл использовать временную таблицу, если есть табличные переменные TempTable1 и cte? Неужели такой подход значительно увеличит время выгрузки, если используем рекурсию? Только вот такие временные таблицы я еще не создавал, следовательно, затрудняюсь в понимании как их делать.это не табличные переменные

// затрудняюсь

выше, полностью готовый скрипт на твоих данных
добавь ещё в конце

Код: sql
1.
drop table #TempTable1, #T


и запускай

Будет не удовлетворительно по времени, - ещё с индексом можно "поиграться"
...
Рейтинг: 0 / 0
Предыдущее значение вычисляемого поля
    #39629676
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
court,

А если сохранять не во временную таблицу, а в саму таблицу в базу данных (и она как бы и временная)? То вроде должно быть быстрее.
...
Рейтинг: 0 / 0
Предыдущее значение вычисляемого поля
    #39635464
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем тормозит именно из за этого
Код: sql
1.
SELECT * FROM cte ORDER BY  [Клиент], [Код юрлица], [Код ТТ], [Код продукции], id


Как можно ускорить? Или все равно надо иcпользовать временную таблицу с индексами?
...
Рейтинг: 0 / 0
Предыдущее значение вычисляемого поля
    #39635534
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikkВ общем тормозит именно из за этого
Код: sql
1.
SELECT * FROM cte ORDER BY  [Клиент], [Код юрлица], [Код ТТ], [Код продукции], id


Как можно ускорить? Или все равно надо иcпользовать временную таблицу с индексами?
И еще
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
WITH	
TempTable1 AS (
	SELECT
		[Клиент],
		[Код юрлица],
		[Код ТТ],
		[Код продукции],	
		[Дата],
		[Отгрузки шт],
		[Возвраты шт],
		[Реализация шт],
		[Отгрузки сумма без НДС],		
		[Цена без НДС]			
	FROM
		Shipments	
	WHERE
		[Код ТТ]=N'00001грд'
...


В таблице Shipments 6 миллионов строк. Я думаю, что при отборе через WHERE подтормаживает сильно.
...
Рейтинг: 0 / 0
Предыдущее значение вычисляемого поля
    #39636370
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
courtвыше, полностью готовый скрипт на твоих данных
добавь ещё в конце
Код: sql
1.
drop table #TempTable1, #T


и запускай

Будет не удовлетворительно по времени, - ещё с индексом можно "поиграться"
Разобрался с временными таблицами. Результат стал намного удовлетворительным. 6 млн строк за 40 минут.

Дальше в коде после рекурсии используются последующие табличные переменные (без использования рекурсии). Если их заменить временными таблицами, то еще быстрее будет работать?
...
Рейтинг: 0 / 0
Предыдущее значение вычисляемого поля
    #39637473
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Присутствует поле [Маркировка по пред цене]. Теперь надо добавить поле [Маркировка по посл цене], который идет снизу вверх.
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.
64.
65.
66.
67.
68.
Declare @ДельтаПредел decimal(5,2) = 0.07;

SELECT
	[Клиент],
	[Код юрлица],
	[Код ТТ],
	[Код продукции],	
	[Дата],
	[Отгрузки шт],
	[Возвраты шт],
	[Реализация шт],
	[Отгрузки сумма без НДС],
	[Отгрузки сумма с НДС],
	[Расчетная цена без НДС],
	[Расчетная цена с НДС],
	id=ROW_NUMBER()over(Partition by [Клиент], [Код юрлица], [Код ТТ], [Код продукции] order by  Convert(datetime,[Дата],104)),
	id2=ROW_NUMBER()over(Partition by [Клиент], [Код юрлица], [Код ТТ], [Код продукции] order by  Convert(datetime,[Дата],104)DESC)
INTO
	#Т
FROM
	Shipments		
;
CREATE /*CLUSTERED*/ INDEX i1 ON #Т([Клиент], [Код юрлица], [Код ТТ], [Код продукции], id); 
WITH
	cte AS (
		SELECT
			*,
			т.[Расчетная цена без НДС] AS [Расчетная цена без НДС пред],
			0 AS [Маркировка по пред цене],
			[Расчетная цена без НДС пред которая используется в расчете]=cast(null as decimal(8,0))
		FROM
			#Т т 
		WHERE
			id=1
	UNION ALL	
	SELECT
		т.*,
		т.[Расчетная цена без НДС], 
		CASE
			WHEN cte.[Расчетная цена без НДС пред] IS NOT NULL AND cte.[Расчетная цена без НДС пред] <> 0 THEN
				CASE
					WHEN ((т.[Расчетная цена без НДС] / cte.[Расчетная цена без НДС пред])-1) <= -@ДельтаПредел THEN
						1
					ELSE
						CASE
							WHEN  ((т.[Расчетная цена без НДС] / cte.[Расчетная цена без НДС пред])-1) <= @ДельтаПредел AND cte.[Маркировка по пред цене] =1 THEN
								1
							ELSE
								0
							END
				END
		END,
		cte.[Расчетная цена без НДС пред]
	FROM
		#Т т 
	inner join
		cte
	ON
		т.id=cte.id+1
		AND
		т.[Клиент]=cte.[Клиент]
		AND 
		т.[Код юрлица]=cte.[Код юрлица]
		AND 
		т.[Код ТТ]=cte.[Код ТТ]
		AND 
		т.[Код продукции]=cte.[Код продукции]
),

Как лучше сделать? Получить отдельно cte2 (обращается к id2), и потом соединить cte и cte2?
...
Рейтинг: 0 / 0
Предыдущее значение вычисляемого поля
    #39638099
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikkДальше в коде после рекурсии используются последующие табличные переменные (без использования рекурсии). Если их заменить временными таблицами, то еще быстрее будет работать?
Заменил все табличные переменные на временные таблицы. Стало работать намного быстрее.
...
Рейтинг: 0 / 0
Предыдущее значение вычисляемого поля
    #39638100
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
court,

Спасибо!
...
Рейтинг: 0 / 0
Предыдущее значение вычисляемого поля
    #39638101
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но задачка интересная очень вот!)
...
Рейтинг: 0 / 0
21 сообщений из 46, страница 2 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Предыдущее значение вычисляемого поля
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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