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

Решаю задачу.

Есть четыре таблицы:
1. @Таблица_Отгрузки. Данные по ТТ+SKU+Дата об отгрузкахКод юрлица Код ТТ Код номенклатуры Дата ОтгрузкиКод юрлица1 Код ТТ1 12344 2018-02-01 10Код юрлица1 Код ТТ1 12344 2018-02-02 5Код юрлица1 Код ТТ1 12344 2018-02-03 2Код юрлица1 Код ТТ1 12344 2018-02-04 3Код юрлица1 Код ТТ1 12600 2018-02-01 12Код юрлица1 Код ТТ1 12600 2018-02-02 8Код юрлица1 Код ТТ1 12600 2018-02-03 6Код юрлица1 Код ТТ1 12344 2018-02-04 4Код юрлица2 Код ТТ4 12344 2018-02-01 12Код юрлица2 Код ТТ4 12344 2018-02-02 8Код юрлица2 Код ТТ4 12344 2018-02-03 6Код юрлица2 Код ТТ4 12344 2018-02-04 4
2. @Таблица_Клиенты. Справочная таблицаКод клиента Код юрлица Вид клиента Прайс группаКод юрлица1 NULL 0 Прайс группа1Код ТТ2 Код юрлица1 0 NULLКод ТТ3 Код юрлица1 0 NULLКод ТТ4 Код юрлица1 0 NULLКод ТТ4 Код юрлица2 1 Прайс группа2
3. @Таблица_ГруппыПрайсов. Таблица прайс листов. Просто списокГруппа ценПрайс группа1Прайс группа2Прайс группа3
4. @Таблица_Цены. Таблица цены.AccountRelation Код номенклатуры Дата начала Дата окончания Цена Акционная цена АннулированоКод юрлица1 12344 2018-02-01 2018-02-02 150.00 0 0Код юрлица1 12344 2018-02-03 2018-02-04 160.00 0 0Код юрлица1 12600 2018-02-01 2018-02-02 170.00 0 0Код юрлица1 12600 2018-02-03 2018-02-04 175.00 0 0Код юрлица2 12344 2018-02-01 2018-02-02 155.00 0 0Код юрлица2 12344 2018-02-03 2018-02-04 165.00 0 0Код юрлица2 12600 2018-02-01 2018-02-02 125.00 0 0Код юрлица2 12600 2018-02-03 2018-02-04 135.00 0 0Код ТТ1 12344 2018-02-01 2018-02-02 150.00 0 0Код ТТ1 12344 2018-02-03 2018-02-04 152.00 0 0Код ТТ1 12600 2018-02-01 2018-02-02 160.00 0 0Код ТТ1 12600 2018-02-03 2018-02-04 172.00 0 0Код ТТ4 12344 2018-02-01 2018-02-02 150.00 0 0Код ТТ4 12344 2018-02-03 2018-02-04 152.00 0 0Код ТТ4 12600 2018-02-01 2018-02-02 160.00 0 0Код ТТ4 12600 2018-02-03 2018-02-04 172.00 0 0Прайс группа1 12344 2018-02-01 2018-02-02 150.00 0 0Прайс группа1 12344 2018-02-03 2018-02-04 152.00 0 0Прайс группа1 12600 2018-02-01 2018-02-02 160.00 0 0Прайс группа1 12600 2018-02-03 2018-02-04 172.00 0 0Прайс группа1 12344 2018-02-01 2018-02-02 150.00 0 0Прайс группа1 12344 2018-02-03 2018-02-04 152.00 0 0Прайс группа1 12600 2018-02-01 2018-02-02 160.00 0 0Прайс группа1 12600 2018-02-03 2018-02-04 172.00 0 0Прайс группа2 12344 2018-02-01 2018-02-02 150.00 0 0Прайс группа2 12344 2018-02-03 2018-02-04 152.00 0 0Прайс группа2 12600 2018-02-01 2018-02-02 160.00 0 0Прайс группа2 12600 2018-02-03 2018-02-04 172.00 0 0Прайс группа2 12344 2018-02-01 2018-02-02 150.00 00Прайс группа2 12344 2018-02-03 2018-02-04 152.00 0 0Прайс группа2 12600 2018-02-01 2018-02-02 160.00 0 0Прайс группа2 12600 2018-02-03 2018-02-04 172.00 0 0

Задача такая что нужно вытащить цену по соответствующей первой таблице, то есть по ТТ+SKU+Дата.

Цену определяем таким образом, что сначала вытаскиваем из справочной таблицы Клиенты Прайс ТТ и Прайс юр лица , а потом по схеме:
1. Пробегаем по таблице @Таблица_Цены и ищем ТТ. Если не находим ТТ, то ищем переходим на следующий пункт
2. Пробегаем по таблице @Таблица_Цены и ищем прайс ТТ. Если не находим прайс ТТ, то ищем переходим на следующий пункт
3. Пробегаем по таблице @Таблица_Цены и ищем юр лицо. Если не находим юр лицо, то ищем переходим на следующий пункт
4. Пробегаем по таблице @Таблица_Цены и ищем прайс юр лица.

У начального пункта цена самая приоритетная. То есть первый пункт приоритетнее 2, второй пункт приоритетнее 3, и т.д.

Получается 1 и 3 пункт это индивидуальная цена, а 2 и 4 типа общая - прайсовая.

Важно учесть,что если у цены не указана [Дата окончания], то это действующая цена.

Написал SQL-запрос. Запутался с этими приоритетами. Не работает так как надо, дублируются строки.

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.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
DECLARE @Таблица_Отгрузки table(
	[Код юрлица] varchar(20),
	[Код ТТ] varchar(10),
	[Код номенклатуры] integer,
	[Дата] date,
	[Отгрузки] integer
);

INSERT INTO
  @Таблица_Отгрузки
VALUES 
('Код юрлица1','Код ТТ1',12344,'01.02.2018',10),
('Код юрлица1','Код ТТ1',12344,'02.02.2018',5),
('Код юрлица1','Код ТТ1',12344,'03.02.2018',2),
('Код юрлица1','Код ТТ1',12344,'04.02.2018',3),
('Код юрлица1','Код ТТ1',12600,'01.02.2018',12),
('Код юрлица1','Код ТТ1',12600,'02.02.2018',8),
('Код юрлица1','Код ТТ1',12600,'03.02.2018',6),
('Код юрлица1','Код ТТ1',12344,'04.02.2018',4),
('Код юрлица2','Код ТТ4',12344,'01.02.2018',12),
('Код юрлица2','Код ТТ4',12344,'02.02.2018',8),
('Код юрлица2','Код ТТ4',12344,'03.02.2018',6),
('Код юрлица2','Код ТТ4',12344,'04.02.2018',4)


DECLARE @Таблица_Клиенты table(
	[Код клиента] varchar(20),
	[Код юрлица] varchar(20),
	[Вид клиента] bit, -- 0 - это юр лицо, 1 - это ТТ
	[Прайс группа] varchar(20)
);

INSERT INTO
  @Таблица_Клиенты 
VALUES 
('Код юрлица1', Null, 0,'Прайс группа1'),
('Код ТТ2', 'Код юрлица1', 0,null),
('Код ТТ3', 'Код юрлица1', 0,null),
('Код ТТ4', 'Код юрлица1', 0,null),
('Код ТТ4', 'Код юрлица2', 1,'Прайс группа2')


DECLARE @Таблица_ГруппыПрайсов table(
	[Группа цен] varchar(20)	
);

INSERT INTO
  @Таблица_ГруппыПрайсов
VALUES 
('Прайс группа1'),
('Прайс группа2'),
('Прайс группа3')

DECLARE @Таблица_Цены table(
	[AccountRelation] varchar(20),
	[Код номенклатуры] integer,
	[Дата начала] date,
	[Дата окончания] date,
	[Цена] decimal(8,2),
	[Акционная цена] bit,
	[Аннулировано] bit
);

INSERT INTO
  @Таблица_Цены 
VALUES 
('Код юрлица1',12344,'01.02.2018', '02.02.2018', 150,0,0),
('Код юрлица1',12344,'03.02.2018', '04.02.2018', 160,0,0),
('Код юрлица1',12600,'01.02.2018', '02.02.2018', 170,0,0),
('Код юрлица1',12600,'03.02.2018', '04.02.2018', 175,0,0),
('Код юрлица2',12344,'01.02.2018', '02.02.2018', 155,0,0),
('Код юрлица2',12344,'03.02.2018', '04.02.2018', 165,0,0),
('Код юрлица2',12600,'01.02.2018', '02.02.2018', 125,0,0),
('Код юрлица2',12600,'03.02.2018', '04.02.2018', 135,0,0),
('Код ТТ1',12344,'01.02.2018', '02.02.2018', 150,0,0),
('Код ТТ1',12344,'03.02.2018', '04.02.2018', 152,0,0),
('Код ТТ1',12600,'01.02.2018', '02.02.2018', 160,0,0),
('Код ТТ1',12600,'03.02.2018', '04.02.2018', 172,0,0),
('Код ТТ4',12344,'01.02.2018', '02.02.2018', 150,0,0),
('Код ТТ4',12344,'03.02.2018', '04.02.2018', 152,0,0),
('Код ТТ4',12600,'01.02.2018', '02.02.2018', 160,0,0),
('Код ТТ4',12600,'03.02.2018', '04.02.2018', 172,0,0),
('Прайс группа1',12344,'01.02.2018', '02.02.2018', 150,0,0),
('Прайс группа1',12344,'03.02.2018', '04.02.2018', 152,0,0),
('Прайс группа1',12600,'01.02.2018', '02.02.2018', 160,0,0),
('Прайс группа1',12600,'03.02.2018', '04.02.2018', 172,0,0),
('Прайс группа1',12344,'01.02.2018', '02.02.2018', 150,0,0),
('Прайс группа1',12344,'03.02.2018', '04.02.2018', 152,0,0),
('Прайс группа1',12600,'01.02.2018', '02.02.2018', 160,0,0),
('Прайс группа1',12600,'03.02.2018', '04.02.2018', 172,0,0),
('Прайс группа2',12344,'01.02.2018', '02.02.2018', 150,0,0),
('Прайс группа2',12344,'03.02.2018', '04.02.2018', 152,0,0),
('Прайс группа2',12600,'01.02.2018', '02.02.2018', 160,0,0),
('Прайс группа2',12600,'03.02.2018', '04.02.2018', 172,0,0),
('Прайс группа2',12344,'01.02.2018', '02.02.2018', 150,0,0),
('Прайс группа2',12344,'03.02.2018', '04.02.2018', 152,0,0),
('Прайс группа2',12600,'01.02.2018', '02.02.2018', 160,0,0),
('Прайс группа2',12600,'03.02.2018', '04.02.2018', 172,0,0)
;

WITH
	Таблица1 AS (
	SELECT
		Т_отгр.[Код юрлица],
		Т_отгр.[Код ТТ],
		Т_отгр.[Код номенклатуры],
		Т_отгр.[Дата],
		Т_отгр.[Отгрузки],	
		Т_клиТТ.[Прайс группа] AS [ТТ прайс группа],
		Т_клиЮр.[Прайс группа] AS [Юр лицо прайс группа]		
	FROM
		@Таблица_Отгрузки Т_отгр
	LEFT JOIN
		@Таблица_Клиенты Т_клиТТ
	ON
		Т_отгр.[Код ТТ]= Т_клиТТ.[Код клиента] AND Т_клиТТ.[Вид клиента] = 1
	LEFT JOIN
		 @Таблица_Клиенты Т_клиЮр
	ON
		Т_отгр.[Код юрлица] = Т_клиЮр.[Код клиента] AND Т_клиЮр.[Вид клиента] = 0
),

Таблица2 AS (
	SELECT
		Т1.[Код юрлица],
		Т1.[Код ТТ],
		Т1.[Код номенклатуры],
		Т1.[Дата],
		Т1.[Отгрузки],	
		Т1.[ТТ прайс группа],
		Т1.[Юр лицо прайс группа],
		Т_ЦенТТ.Цена AS [Цена ТТ],
		Т_ЦенТТ.[Акционная цена] AS [Акционная цена ТТ],
		Т_ЦенПрайсТТ.Цена AS [Цена прайс ТТ],
		Т_ЦенПрайсТТ.[Акционная цена] AS [Акционная цена Прайс ТТ],
		Т_ЦенЮр.Цена AS [Цена юр лицо],
		Т_ЦенЮр.[Акционная цена] AS [Акционная цена Юр лицо],
		Т_ЦенПрайсЮр.Цена AS [Цена прайс юр лицо],
		Т_ЦенПрайсЮр.[Акционная цена] AS [Акционная цена Прайс Юр лицо]
	FROM
		Таблица1 Т1
	--Соединяем цены ТТ
	LEFT JOIN
		@Таблица_Цены Т_ЦенТТ
	ON
		Т1.[Код ТТ] = Т_ЦенТТ.[AccountRelation] AND Т1.[Код номенклатуры] = Т_ЦенТТ.[Код номенклатуры] AND
			(Т1.Дата >= Т_ЦенТТ.[Дата начала] OR Т1.Дата <= Т_ЦенТТ.[Дата окончания]) AND Т_ЦенТТ.Аннулировано = 0
	--Соединяем прайс цены ТТ
	LEFT JOIN
		@Таблица_Цены Т_ЦенПрайсТТ
	ON
		Т1.[ТТ прайс группа] = Т_ЦенПрайсТТ.[AccountRelation] AND Т1.[Код номенклатуры] = Т_ЦенПрайсТТ.[Код номенклатуры] AND
			(Т1.Дата >= Т_ЦенПрайсТТ.[Дата начала] OR Т1.Дата <= Т_ЦенПрайсТТ.[Дата окончания]) AND Т_ЦенПрайсТТ.Аннулировано = 0
	--Соединяем цены Юр лица
	LEFT JOIN
		@Таблица_Цены Т_ЦенЮр
	ON
		Т1.[Код юрлица] = Т_ЦенЮр.[AccountRelation] AND Т1.[Код номенклатуры] = Т_ЦенЮр.[Код номенклатуры] AND
			(Т1.Дата >= Т_ЦенЮр.[Дата начала] OR Т1.Дата <= Т_ЦенЮр.[Дата окончания]) AND Т_ЦенЮр.Аннулировано = 0
	--Соединяем прайс цены Юр лица
	LEFT JOIN
		@Таблица_Цены Т_ЦенПрайсЮр
	ON
		Т1.[Юр лицо прайс группа] = Т_ЦенПрайсЮр.[AccountRelation] AND Т1.[Код номенклатуры] = Т_ЦенПрайсЮр.[Код номенклатуры] AND
			(Т1.Дата >= Т_ЦенПрайсЮр.[Дата начала] OR Т1.Дата <= Т_ЦенПрайсЮр.[Дата окончания]) AND Т_ЦенПрайсЮр.Аннулировано = 0
)

SELECT
	Т2.[Код юрлица],
	Т2.[Код ТТ],
	Т2.[Код номенклатуры],
	Т2.[Дата],
	Т2.[Отгрузки],	
	(CASE 
		WHEN NOT Т2.[Цена ТТ] IS NULL THEN Т2.[Цена ТТ]
		WHEN NOT Т2.[Цена прайс ТТ] IS NULL THEN Т2.[Цена прайс ТТ]
		WHEN NOT Т2.[Цена юр лицо] IS NULL THEN Т2.[Цена юр лицо]
		WHEN NOT Т2.[Цена прайс юр лицо] IS NULL THEN Т2.[Цена прайс юр лицо]
	END) AS [Цена],
	(CASE 
		WHEN NOT Т2.[Цена ТТ] IS NULL THEN Т2.[Акционная цена ТТ]
		WHEN NOT Т2.[Цена прайс ТТ] IS NULL THEN Т2.[Акционная цена Прайс ТТ]
		WHEN NOT Т2.[Цена юр лицо] IS NULL THEN Т2.[Акционная цена Юр лицо]
		WHEN NOT Т2.[Цена прайс юр лицо] IS NULL THEN Т2.[Акционная цена Прайс Юр лицо]
	END) AS [Акционная цена]

FROM
	Таблица2 Т2


Не обращайте внимание что название полей на русском языке, это для примера и для понятности.

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

лефт джойним ВСЕ таблицы с ценами
потом через
coalesce(таблица1.Цена,таблица2.Цена ... таблица5.Цена) as Цена
...
Рейтинг: 0 / 0
Вытащить цены
    #39626834
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StarikNavyferzmikk,

лефт джойним ВСЕ таблицы с ценами
потом через
coalesce(таблица1.Цена,таблица2.Цена ... таблица5.Цена) as Цена
Получается вместо этого
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
        ...
        Т_ЦенТТ.Цена AS [Цена ТТ],
	Т_ЦенТТ.[Акционная цена] AS [Акционная цена ТТ],
	Т_ЦенПрайсТТ.Цена AS [Цена прайс ТТ],
	Т_ЦенПрайсТТ.[Акционная цена] AS [Акционная цена Прайс ТТ],
	Т_ЦенЮр.Цена AS [Цена юр лицо],
	Т_ЦенЮр.[Акционная цена] AS [Акционная цена Юр лицо],
	Т_ЦенПрайсЮр.Цена AS [Цена прайс юр лицо],
	Т_ЦенПрайсЮр.[Акционная цена] AS [Акционная цена Прайс Юр лицо]
        ...


пишу так
Код: sql
1.
2.
3.
4.
	...
        COALESCE(Т_ЦенТТ.Цена, Т_ЦенПрайсТТ.Цена, Т_ЦенЮр.Цена, Т_ЦенПрайсЮр.Цена) AS [Цена],
	COALESCE(Т_ЦенТТ.[Акционная цена], Т_ЦенПрайсТТ.[Акционная цена], Т_ЦенЮр.[Акционная цена], Т_ЦенПрайсЮр.[Акционная цена]) AS [Акционная цена]
        ...



Возникает вопрос. Может ли быть такое, что, например, для какой то строки для обоих полей [Цена] и [Акционная цена] COALESCE возвращает соответственно не одинаковые приоритеты? Если да, то как можно избежать?
...
Рейтинг: 0 / 0
Вытащить цены
    #39626902
Фотография StarikNavy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
приоритеты задаются через список таблиц 1, 2, 3
можно одну и туже таблицу цеплять пару раз, с дополнительными условиями в джойне

ну и ,
Код: sql
1.
case 

на совсем крайний случай
...
Рейтинг: 0 / 0
Вытащить цены
    #39626906
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StarikNavyприоритеты задаются через список таблиц 1, 2, 3
можно одну и туже таблицу цеплять пару раз, с дополнительными условиями в джойне

ну и ,
Код: sql
1.
case 

на совсем крайний случай
Как это в коде выглядит?
...
Рейтинг: 0 / 0
Вытащить цены
    #39627362
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StarikNavyприоритеты задаются через список таблиц 1, 2, 3
можно одну и туже таблицу цеплять пару раз, с дополнительными условиями в джойне

ну и ,
Код: sql
1.
case 

на совсем крайний случай
Как в коде задаются приоритеты через список таблиц?
...
Рейтинг: 0 / 0
Вытащить цены
    #39627672
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.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
DECLARE @Таблица_Отгрузки table(
	[Код юрлица] varchar(20),
	[Код ТТ] varchar(10),
	[Код номенклатуры] integer,
	[Дата] date,
	[Отгрузки] integer
);

INSERT INTO
  @Таблица_Отгрузки
VALUES 
('Код юрлица1','Код ТТ1',12344,'01.02.2018',10),
('Код юрлица1','Код ТТ1',12344,'02.02.2018',5),
('Код юрлица1','Код ТТ1',12344,'03.02.2018',2),
('Код юрлица1','Код ТТ1',12344,'04.02.2018',3),
('Код юрлица1','Код ТТ1',12600,'01.02.2018',12),
('Код юрлица1','Код ТТ1',12600,'02.02.2018',8),
('Код юрлица1','Код ТТ1',12600,'03.02.2018',6),
('Код юрлица1','Код ТТ1',12344,'04.02.2018',4),
('Код юрлица2','Код ТТ4',12344,'01.02.2018',12),
('Код юрлица2','Код ТТ4',12344,'02.02.2018',8),
('Код юрлица2','Код ТТ4',12344,'03.02.2018',6),
('Код юрлица2','Код ТТ4',12344,'04.02.2018',4)


DECLARE @Таблица_Клиенты table(
	[Код клиента] varchar(20),
	[Код юрлица] varchar(20),
	[Вид клиента] bit, -- 0 - это юр лицо, 1 - это ТТ
	[Прайс группа] varchar(20)
);

INSERT INTO
  @Таблица_Клиенты 
VALUES 
('Код юрлица1', Null, 0,'Прайс группа1'),
('Код ТТ2', 'Код юрлица1', 0,null),
('Код ТТ3', 'Код юрлица1', 0,null),
('Код ТТ4', 'Код юрлица1', 0,null),
('Код ТТ4', 'Код юрлица2', 1,'Прайс группа2')


DECLARE @Таблица_ГруппыПрайсов table(
	[Группа цен] varchar(20)	
);

INSERT INTO
  @Таблица_ГруппыПрайсов
VALUES 
('Прайс группа1'),
('Прайс группа2'),
('Прайс группа3')

DECLARE @Таблица_Цены table(
	[AccountRelation] varchar(20),
	[Код номенклатуры] integer,
	[Дата начала] date,
	[Дата окончания] date,
	[Цена] decimal(8,2),
	[Акционная цена] bit,
	[Аннулировано] bit
);

INSERT INTO
  @Таблица_Цены 
VALUES 
('Код юрлица1',12344,'01.02.2018', '02.02.2018', 150,0,0),
('Код юрлица1',12344,'03.02.2018', '04.02.2018', 160,0,0),
('Код юрлица1',12600,'01.02.2018', '02.02.2018', 170,0,0),
('Код юрлица1',12600,'03.02.2018', '04.02.2018', 175,0,0),
('Код юрлица2',12344,'01.02.2018', '02.02.2018', 155,0,0),
('Код юрлица2',12344,'03.02.2018', '04.02.2018', 165,0,0),
('Код юрлица2',12600,'01.02.2018', '02.02.2018', 125,0,0),
('Код юрлица2',12600,'03.02.2018', '04.02.2018', 135,0,0),
('Код ТТ1',12344,'01.02.2018', '02.02.2018', 150,0,0),
('Код ТТ1',12344,'03.02.2018', '04.02.2018', 152,0,0),
('Код ТТ1',12600,'01.02.2018', '02.02.2018', 160,0,0),
('Код ТТ1',12600,'03.02.2018', '04.02.2018', 172,0,0),
('Код ТТ4',12344,'01.02.2018', '02.02.2018', 150,0,0),
('Код ТТ4',12344,'03.02.2018', '04.02.2018', 152,0,0),
('Код ТТ4',12600,'01.02.2018', '02.02.2018', 160,0,0),
('Код ТТ4',12600,'03.02.2018', '04.02.2018', 172,0,0),
('Прайс группа1',12344,'01.02.2018', '02.02.2018', 150,0,0),
('Прайс группа1',12344,'03.02.2018', '04.02.2018', 152,0,0),
('Прайс группа1',12600,'01.02.2018', '02.02.2018', 160,0,0),
('Прайс группа1',12600,'03.02.2018', '04.02.2018', 172,0,0),
('Прайс группа1',12344,'01.02.2018', '02.02.2018', 150,0,0),
('Прайс группа1',12344,'03.02.2018', '04.02.2018', 152,0,0),
('Прайс группа1',12600,'01.02.2018', '02.02.2018', 160,0,0),
('Прайс группа1',12600,'03.02.2018', '04.02.2018', 172,0,0),
('Прайс группа2',12344,'01.02.2018', '02.02.2018', 150,0,0),
('Прайс группа2',12344,'03.02.2018', '04.02.2018', 152,0,0),
('Прайс группа2',12600,'01.02.2018', '02.02.2018', 160,0,0),
('Прайс группа2',12600,'03.02.2018', '04.02.2018', 172,0,0),
('Прайс группа2',12344,'01.02.2018', '02.02.2018', 150,0,0),
('Прайс группа2',12344,'03.02.2018', '04.02.2018', 152,0,0),
('Прайс группа2',12600,'01.02.2018', '02.02.2018', 160,0,0),
('Прайс группа2',12600,'03.02.2018', '04.02.2018', 172,0,0)
;

WITH
	Таблица1 AS (
	SELECT
		Т_отгр.[Код юрлица],
		Т_отгр.[Код ТТ],
		Т_отгр.[Код номенклатуры],
		Т_отгр.[Дата],
		Т_отгр.[Отгрузки],	
		Т_клиТТ.[Прайс группа] AS [ТТ прайс группа],
		Т_клиЮр.[Прайс группа] AS [Юр лицо прайс группа]		
	FROM
		@Таблица_Отгрузки Т_отгр
	LEFT JOIN
		@Таблица_Клиенты Т_клиТТ
	ON
		Т_отгр.[Код ТТ]= Т_клиТТ.[Код клиента] AND Т_клиТТ.[Вид клиента] = 1
	LEFT JOIN
		 @Таблица_Клиенты Т_клиЮр
	ON
		Т_отгр.[Код юрлица] = Т_клиЮр.[Код клиента] AND Т_клиЮр.[Вид клиента] = 0
),

Таблица2 AS (
	SELECT
		Т1.[Код юрлица],
		Т1.[Код ТТ],
		Т1.[Код номенклатуры],
		Т1.[Дата],
		Т1.[Отгрузки],	
		Т1.[ТТ прайс группа],
		Т1.[Юр лицо прайс группа],
		--Т_ЦенТТ.Цена AS [Цена ТТ],
		--Т_ЦенТТ.[Акционная цена] AS [Акционная цена ТТ],
		--Т_ЦенПрайсТТ.Цена AS [Цена прайс ТТ],
		--Т_ЦенПрайсТТ.[Акционная цена] AS [Акционная цена Прайс ТТ],
		--Т_ЦенЮр.Цена AS [Цена юр лицо],
		--Т_ЦенЮр.[Акционная цена] AS [Акционная цена Юр лицо],
		--Т_ЦенПрайсЮр.Цена AS [Цена прайс юр лицо],
		--Т_ЦенПрайсЮр.[Акционная цена] AS [Акционная цена Прайс Юр лицо],
		COALESCE(Т_ЦенТТ.Цена, Т_ЦенПрайсТТ.Цена, Т_ЦенЮр.Цена, Т_ЦенПрайсЮр.Цена) AS [Цена],
		COALESCE(Т_ЦенТТ.[Акционная цена], Т_ЦенПрайсТТ.[Акционная цена], Т_ЦенЮр.[Акционная цена], Т_ЦенПрайсЮр.[Акционная цена]) AS [Акционная цена]
	FROM
		Таблица1 Т1
	--Соединяем цены ТТ
	LEFT JOIN
		@Таблица_Цены Т_ЦенТТ
	ON
		Т1.[Код ТТ] = Т_ЦенТТ.[AccountRelation] AND Т1.[Код номенклатуры] = Т_ЦенТТ.[Код номенклатуры] AND
			(Т1.Дата >= Т_ЦенТТ.[Дата начала] OR Т1.Дата <= Т_ЦенТТ.[Дата окончания]) AND Т_ЦенТТ.Аннулировано = 0
	--Соединяем прайс цены ТТ
	LEFT JOIN
		@Таблица_Цены Т_ЦенПрайсТТ
	ON
		Т1.[ТТ прайс группа] = Т_ЦенПрайсТТ.[AccountRelation] AND Т1.[Код номенклатуры] = Т_ЦенПрайсТТ.[Код номенклатуры] AND
			(Т1.Дата >= Т_ЦенПрайсТТ.[Дата начала] OR Т1.Дата <= Т_ЦенПрайсТТ.[Дата окончания]) AND Т_ЦенПрайсТТ.Аннулировано = 0
	--Соединяем цены Юр лица
	LEFT JOIN
		@Таблица_Цены Т_ЦенЮр
	ON
		Т1.[Код юрлица] = Т_ЦенЮр.[AccountRelation] AND Т1.[Код номенклатуры] = Т_ЦенЮр.[Код номенклатуры] AND
			(Т1.Дата >= Т_ЦенЮр.[Дата начала] OR Т1.Дата <= Т_ЦенЮр.[Дата окончания]) AND Т_ЦенЮр.Аннулировано = 0
	--Соединяем прайс цены Юр лица
	LEFT JOIN
		@Таблица_Цены Т_ЦенПрайсЮр
	ON
		Т1.[Юр лицо прайс группа] = Т_ЦенПрайсЮр.[AccountRelation] AND Т1.[Код номенклатуры] = Т_ЦенПрайсЮр.[Код номенклатуры] AND
			(Т1.Дата >= Т_ЦенПрайсЮр.[Дата начала] OR Т1.Дата <= Т_ЦенПрайсЮр.[Дата окончания]) AND Т_ЦенПрайсЮр.Аннулировано = 0
)

SELECT
	Т2.[Код юрлица],
	Т2.[Код ТТ],
	Т2.[Код номенклатуры],
	Т2.[Дата],
	Т2.[Отгрузки],	
	/*(CASE 
		WHEN NOT Т2.[Цена ТТ] IS NULL THEN Т2.[Цена ТТ]
		WHEN NOT Т2.[Цена прайс ТТ] IS NULL THEN Т2.[Цена прайс ТТ]
		WHEN NOT Т2.[Цена юр лицо] IS NULL THEN Т2.[Цена юр лицо]
		WHEN NOT Т2.[Цена прайс юр лицо] IS NULL THEN Т2.[Цена прайс юр лицо]
	END) AS [Цена],
	(CASE 
		WHEN NOT Т2.[Цена ТТ] IS NULL THEN Т2.[Акционная цена ТТ]
		WHEN NOT Т2.[Цена прайс ТТ] IS NULL THEN Т2.[Акционная цена Прайс ТТ]
		WHEN NOT Т2.[Цена юр лицо] IS NULL THEN Т2.[Акционная цена Юр лицо]
		WHEN NOT Т2.[Цена прайс юр лицо] IS NULL THEN Т2.[Акционная цена Прайс Юр лицо]
	END) AS [Акционная цена]*/
	Т2.Цена,
	Т2.[Акционная цена]
FROM
	Таблица2 Т2

...
Рейтинг: 0 / 0
Вытащить цены
    #39627942
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
DECLARE @Таблица_Отгрузки table(
	[Код юрлица] varchar(20),
	[Код ТТ] varchar(10),
	[Код номенклатуры] integer,
	[Дата] date,
	[Отгрузки] integer
);

INSERT INTO
  @Таблица_Отгрузки
VALUES 
('Код юрлица1','Код ТТ1',12344,'01.02.2018',10),
('Код юрлица1','Код ТТ1',12344,'02.02.2018',5),
('Код юрлица1','Код ТТ1',12344,'03.02.2018',2),
('Код юрлица1','Код ТТ1',12344,'04.02.2018',3),
('Код юрлица1','Код ТТ1',12600,'01.02.2018',12),
('Код юрлица1','Код ТТ1',12600,'02.02.2018',8),
('Код юрлица1','Код ТТ1',12600,'03.02.2018',6),
('Код юрлица1','Код ТТ1',12344,'04.02.2018',4),
('Код юрлица2','Код ТТ4',12344,'01.02.2018',12),
('Код юрлица2','Код ТТ4',12344,'02.02.2018',8),
('Код юрлица2','Код ТТ4',12344,'03.02.2018',6),
('Код юрлица2','Код ТТ4',12344,'04.02.2018',4)


DECLARE @Таблица_Клиенты table(
	[Код клиента] varchar(20),
	[Код юрлица] varchar(20),
	[Вид клиента] bit, -- 0 - это юр лицо, 1 - это ТТ
	[Прайс группа] varchar(20)
);

INSERT INTO
  @Таблица_Клиенты 
VALUES 
('Код юрлица1', Null, 0,'Прайс группа1'),
('Код ТТ2', 'Код юрлица1', 0,null),
('Код ТТ3', 'Код юрлица1', 0,null),
('Код ТТ4', 'Код юрлица1', 0,null),
('Код ТТ4', 'Код юрлица2', 1,'Прайс группа2')


DECLARE @Таблица_ГруппыПрайсов table(
	[Группа цен] varchar(20)	
);

INSERT INTO
  @Таблица_ГруппыПрайсов
VALUES 
('Прайс группа1'),
('Прайс группа2'),
('Прайс группа3')

DECLARE @Таблица_Цены table(
	[AccountRelation] varchar(20),
	[Код номенклатуры] integer,
	[Дата начала] date,
	[Дата окончания] date,
	[Цена] decimal(8,2),
	[Акционная цена] bit,
	[Аннулировано] bit
);

INSERT INTO
  @Таблица_Цены 
VALUES 
('Код юрлица1',12344,'01.02.2018', '02.02.2018', 150,0,0),
('Код юрлица1',12344,'03.02.2018', '04.02.2018', 160,0,0),
('Код юрлица1',12600,'01.02.2018', '02.02.2018', 170,0,0),
('Код юрлица1',12600,'03.02.2018', '04.02.2018', 175,0,0),
('Код юрлица2',12344,'01.02.2018', '02.02.2018', 155,0,0),
('Код юрлица2',12344,'03.02.2018', '04.02.2018', 165,0,0),
('Код юрлица2',12600,'01.02.2018', '02.02.2018', 125,0,0),
('Код юрлица2',12600,'03.02.2018', '04.02.2018', 135,0,0),
('Код ТТ1',12344,'01.02.2018', '02.02.2018', 150,0,0),
('Код ТТ1',12344,'03.02.2018', '04.02.2018', 152,0,0),
('Код ТТ1',12600,'01.02.2018', '02.02.2018', 160,0,0),
('Код ТТ1',12600,'03.02.2018', '04.02.2018', 172,0,0),
('Код ТТ4',12344,'01.02.2018', '02.02.2018', 150,0,0),
('Код ТТ4',12344,'03.02.2018', '04.02.2018', 152,0,0),
('Код ТТ4',12600,'01.02.2018', '02.02.2018', 160,0,0),
('Код ТТ4',12600,'03.02.2018', '04.02.2018', 172,0,0),
('Прайс группа1',12344,'01.02.2018', '02.02.2018', 150,0,0),
('Прайс группа1',12344,'03.02.2018', '04.02.2018', 152,0,0),
('Прайс группа1',12600,'01.02.2018', '02.02.2018', 160,0,0),
('Прайс группа1',12600,'03.02.2018', '04.02.2018', 172,0,0),
('Прайс группа1',12344,'01.02.2018', '02.02.2018', 150,0,0),
('Прайс группа1',12344,'03.02.2018', '04.02.2018', 152,0,0),
('Прайс группа1',12600,'01.02.2018', '02.02.2018', 160,0,0),
('Прайс группа1',12600,'03.02.2018', '04.02.2018', 172,0,0),
('Прайс группа2',12344,'01.02.2018', '02.02.2018', 150,0,0),
('Прайс группа2',12344,'03.02.2018', '04.02.2018', 152,0,0),
('Прайс группа2',12600,'01.02.2018', '02.02.2018', 160,0,0),
('Прайс группа2',12600,'03.02.2018', '04.02.2018', 172,0,0),
('Прайс группа2',12344,'01.02.2018', '02.02.2018', 150,0,0),
('Прайс группа2',12344,'03.02.2018', '04.02.2018', 152,0,0),
('Прайс группа2',12600,'01.02.2018', '02.02.2018', 160,0,0),
('Прайс группа2',12600,'03.02.2018', '04.02.2018', 172,0,0)
;

WITH
	Таблица1 AS (
	SELECT
		Т_отгр.[Код юрлица],
		Т_отгр.[Код ТТ],
		Т_отгр.[Код номенклатуры],
		Т_отгр.[Дата],
		Т_отгр.[Отгрузки],	
		Т_клиТТ.[Прайс группа] AS [ТТ прайс группа],
		Т_клиЮр.[Прайс группа] AS [Юр лицо прайс группа]		
	FROM
		@Таблица_Отгрузки Т_отгр
	LEFT JOIN
		@Таблица_Клиенты Т_клиТТ
	ON
		Т_отгр.[Код ТТ]= Т_клиТТ.[Код клиента] AND Т_клиТТ.[Вид клиента] = 1
	LEFT JOIN
		 @Таблица_Клиенты Т_клиЮр
	ON
		Т_отгр.[Код юрлица] = Т_клиЮр.[Код клиента] AND Т_клиЮр.[Вид клиента] = 0
),

Таблица2 AS (
	SELECT
		Т1.[Код юрлица],
		Т1.[Код ТТ],
		Т1.[Код номенклатуры],
		Т1.[Дата],
		Т1.[Отгрузки],	
		Т1.[ТТ прайс группа],
		Т1.[Юр лицо прайс группа],
		--Т_ЦенТТ.Цена AS [Цена ТТ],
		--Т_ЦенТТ.[Акционная цена] AS [Акционная цена ТТ],
		--Т_ЦенПрайсТТ.Цена AS [Цена прайс ТТ],
		--Т_ЦенПрайсТТ.[Акционная цена] AS [Акционная цена Прайс ТТ],
		--Т_ЦенЮр.Цена AS [Цена юр лицо],
		--Т_ЦенЮр.[Акционная цена] AS [Акционная цена Юр лицо],
		--Т_ЦенПрайсЮр.Цена AS [Цена прайс юр лицо],
		--Т_ЦенПрайсЮр.[Акционная цена] AS [Акционная цена Прайс Юр лицо],
		COALESCE(Т_ЦенТТ.Цена, Т_ЦенПрайсТТ.Цена, Т_ЦенЮр.Цена, Т_ЦенПрайсЮр.Цена) AS [Цена],
		COALESCE(Т_ЦенТТ.[Акционная цена], Т_ЦенПрайсТТ.[Акционная цена], Т_ЦенЮр.[Акционная цена], Т_ЦенПрайсЮр.[Акционная цена]) AS [Акционная цена]
	FROM
		Таблица1 Т1
	--Соединяем цены ТТ
	LEFT JOIN
		@Таблица_Цены Т_ЦенТТ
	ON
		Т1.[Код ТТ] = Т_ЦенТТ.[AccountRelation] AND Т1.[Код номенклатуры] = Т_ЦенТТ.[Код номенклатуры] AND
			(Т1.Дата >= Т_ЦенТТ.[Дата начала] OR Т1.Дата <= Т_ЦенТТ.[Дата окончания]) AND Т_ЦенТТ.Аннулировано = 0
	--Соединяем прайс цены ТТ
	LEFT JOIN
		@Таблица_Цены Т_ЦенПрайсТТ
	ON
		Т1.[ТТ прайс группа] = Т_ЦенПрайсТТ.[AccountRelation] AND Т1.[Код номенклатуры] = Т_ЦенПрайсТТ.[Код номенклатуры] AND
			(Т1.Дата >= Т_ЦенПрайсТТ.[Дата начала] OR Т1.Дата <= Т_ЦенПрайсТТ.[Дата окончания]) AND Т_ЦенПрайсТТ.Аннулировано = 0
	--Соединяем цены Юр лица
	LEFT JOIN
		@Таблица_Цены Т_ЦенЮр
	ON
		Т1.[Код юрлица] = Т_ЦенЮр.[AccountRelation] AND Т1.[Код номенклатуры] = Т_ЦенЮр.[Код номенклатуры] AND
			(Т1.Дата >= Т_ЦенЮр.[Дата начала] OR Т1.Дата <= Т_ЦенЮр.[Дата окончания]) AND Т_ЦенЮр.Аннулировано = 0
	--Соединяем прайс цены Юр лица
	LEFT JOIN
		@Таблица_Цены Т_ЦенПрайсЮр
	ON
		Т1.[Юр лицо прайс группа] = Т_ЦенПрайсЮр.[AccountRelation] AND Т1.[Код номенклатуры] = Т_ЦенПрайсЮр.[Код номенклатуры] AND
			(Т1.Дата >= Т_ЦенПрайсЮр.[Дата начала] OR Т1.Дата <= Т_ЦенПрайсЮр.[Дата окончания]) AND Т_ЦенПрайсЮр.Аннулировано = 0
)

SELECT
	Т2.[Код юрлица],
	Т2.[Код ТТ],
	Т2.[Код номенклатуры],
	Т2.[Дата],
	Т2.[Отгрузки],	
	/*(CASE 
		WHEN NOT Т2.[Цена ТТ] IS NULL THEN Т2.[Цена ТТ]
		WHEN NOT Т2.[Цена прайс ТТ] IS NULL THEN Т2.[Цена прайс ТТ]
		WHEN NOT Т2.[Цена юр лицо] IS NULL THEN Т2.[Цена юр лицо]
		WHEN NOT Т2.[Цена прайс юр лицо] IS NULL THEN Т2.[Цена прайс юр лицо]
	END) AS [Цена],
	(CASE 
		WHEN NOT Т2.[Цена ТТ] IS NULL THEN Т2.[Акционная цена ТТ]
		WHEN NOT Т2.[Цена прайс ТТ] IS NULL THEN Т2.[Акционная цена Прайс ТТ]
		WHEN NOT Т2.[Цена юр лицо] IS NULL THEN Т2.[Акционная цена Юр лицо]
		WHEN NOT Т2.[Цена прайс юр лицо] IS NULL THEN Т2.[Акционная цена Прайс Юр лицо]
	END) AS [Акционная цена]*/
	Т2.Цена,
	Т2.[Акционная цена]
FROM
	Таблица2 Т2


В общем
1. Дублируются строки
2. Нужно правильно вывести значение поля [Акционная цена] с номером приоритета с соответствующим полученным номером приоритета поля [Цена] .

Как правильно написать?
...
Рейтинг: 0 / 0
Вытащить цены
    #39628051
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Дублируются строки
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
LEFT JOIN dbo.Table1 t1 ON ( t1... = ... )
->
OUTER APPLY (
  SELECT TOP 1
    ... 
  FROM
    dbo.Table1 t1
  WHERE
    t1... = ...
  ORDER BY
    ...
) t1
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вытащить цены
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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