Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Вытащить цены  [new]
ferzmikk
Member

Откуда:
Сообщений: 2059
Здравствуйте!

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

Есть четыре таблицы:
+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-Запрос
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

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

Подскажите как правильно написать?
6 апр 18, 13:25    [21318607]     Ответить | Цитировать Сообщить модератору
 Re: Вытащить цены  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2395
ferzmikk,

лефт джойним ВСЕ таблицы с ценами
потом через
coalesce(таблица1.Цена,таблица2.Цена ... таблица5.Цена) as Цена
6 апр 18, 14:04    [21318859]     Ответить | Цитировать Сообщить модератору
 Re: Вытащить цены  [new]
ferzmikk
Member

Откуда:
Сообщений: 2059
StarikNavy
ferzmikk,

лефт джойним ВСЕ таблицы с ценами
потом через
coalesce(таблица1.Цена,таблица2.Цена ... таблица5.Цена) as Цена

Получается вместо этого
        ...
        Т_ЦенТТ.Цена AS [Цена ТТ],
	Т_ЦенТТ.[Акционная цена] AS [Акционная цена ТТ],
	Т_ЦенПрайсТТ.Цена AS [Цена прайс ТТ],
	Т_ЦенПрайсТТ.[Акционная цена] AS [Акционная цена Прайс ТТ],
	Т_ЦенЮр.Цена AS [Цена юр лицо],
	Т_ЦенЮр.[Акционная цена] AS [Акционная цена Юр лицо],
	Т_ЦенПрайсЮр.Цена AS [Цена прайс юр лицо],
	Т_ЦенПрайсЮр.[Акционная цена] AS [Акционная цена Прайс Юр лицо]
        ...

пишу так
	...
        COALESCE(Т_ЦенТТ.Цена, Т_ЦенПрайсТТ.Цена, Т_ЦенЮр.Цена, Т_ЦенПрайсЮр.Цена) AS [Цена],
	COALESCE(Т_ЦенТТ.[Акционная цена], Т_ЦенПрайсТТ.[Акционная цена], Т_ЦенЮр.[Акционная цена], Т_ЦенПрайсЮр.[Акционная цена]) AS [Акционная цена]
        ...


Возникает вопрос. Может ли быть такое, что, например, для какой то строки для обоих полей [Цена] и [Акционная цена] COALESCE возвращает соответственно не одинаковые приоритеты? Если да, то как можно избежать?
6 апр 18, 14:35    [21318992]     Ответить | Цитировать Сообщить модератору
 Re: Вытащить цены  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2395
приоритеты задаются через список таблиц 1, 2, 3
можно одну и туже таблицу цеплять пару раз, с дополнительными условиями в джойне

ну и ,
case 
на совсем крайний случай
6 апр 18, 16:13    [21319374]     Ответить | Цитировать Сообщить модератору
 Re: Вытащить цены  [new]
ferzmikk
Member

Откуда:
Сообщений: 2059
StarikNavy
приоритеты задаются через список таблиц 1, 2, 3
можно одну и туже таблицу цеплять пару раз, с дополнительными условиями в джойне

ну и ,
case 
на совсем крайний случай

Как это в коде выглядит?
6 апр 18, 16:17    [21319380]     Ответить | Цитировать Сообщить модератору
 Re: Вытащить цены  [new]
ferzmikk
Member

Откуда:
Сообщений: 2059
StarikNavy
приоритеты задаются через список таблиц 1, 2, 3
можно одну и туже таблицу цеплять пару раз, с дополнительными условиями в джойне

ну и ,
case 
на совсем крайний случай

Как в коде задаются приоритеты через список таблиц?
9 апр 18, 08:23    [21322288]     Ответить | Цитировать Сообщить модератору
 Re: Вытащить цены  [new]
ferzmikk
Member

Откуда:
Сообщений: 2059
Подскажите как прописать условие. Запутался.

+
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
9 апр 18, 21:00    [21324682]     Ответить | Цитировать Сообщить модератору
 Re: Вытащить цены  [new]
ferzmikk
Member

Откуда:
Сообщений: 2059
ferzmikk
Подскажите как прописать условие. Запутался.

+
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. Нужно правильно вывести значение поля [Акционная цена] с номером приоритета с соответствующим полученным номером приоритета поля [Цена].

Как правильно написать?
10 апр 18, 14:21    [21326616]     Ответить | Цитировать Сообщить модератору
 Re: Вытащить цены  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
1. Дублируются строки
LEFT JOIN dbo.Table1 t1 ON ( t1... = ... )
->
OUTER APPLY (
  SELECT TOP 1
    ... 
  FROM
    dbo.Table1 t1
  WHERE
    t1... = ...
  ORDER BY
    ...
) t1
10 апр 18, 17:29    [21327423]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить