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

Откуда:
Сообщений: 101
Добрый день


помогите пож-та реализовать следующую задачу:
На сервере хранится:
1. Таблица с Матрицей продуктов (Присутствие продукта: Клиент, Формат Торговой точки. И филиал отгрузки на этого клиента и формат торговой точки)
2. Таблица с планом активностей (промо) в детализации: Продукт, Клиент, Формат, Дата, Объем
3. Таблица с регулярными объемами

Необходимо при помощи средств SQL сформировать таблицу, в которой к каждой строке из таблицы с промо активностям будет подтянуты недостающие данные из Матрицы и Таблицы с регулярными объемами.

Пример во вложении

Версия сервера: Windows Server SQL 2008 R2 Standart

К сообщению приложен файл (Пример.xlsx - 23Kb) cкачать
4 май 16, 17:57    [19134880]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос, хитрое объединение  [new]
iljy
Member

Откуда:
Сообщений: 8711
Юра613,

а чем тут обычный JOIN не подходит?
4 май 16, 18:01    [19134906]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос, хитрое объединение  [new]
Юра613
Member

Откуда:
Сообщений: 101
iljy, может и подходит
У меня не получилось.
Смог получить таблицу типа: Промо активность + одна строка из Матрицы. А надо чтобы для каждой строки из таблицы активностей подтягивались недостающие форматы торговых точек.
4 май 16, 18:52    [19135125]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос, хитрое объединение  [new]
iljy
Member

Откуда:
Сообщений: 8711
Юра613,

и как пробовали?
4 май 16, 19:00    [19135145]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос, хитрое объединение  [new]
Юра613
Member

Откуда:
Сообщений: 101
iljy, пока писал ответ, пришло в голову решение.

сделал так, допускаю что криво и можно и лучше

SELECT 
      V.[Филиал Отгрузки]
    , V.Покупатель
    , M.[Фортмат Точки]
    , V.[Код Продукта]
    , V.Наименование
    , дата
    --, V.Количество
    --, V.[Фортмат Точки] 
    , Val = case
                when M.[Фортмат Точки] = V.[Фортмат Точки] then V.Количество
                else (select количество from t_RegVal T 
                      where 
                             T.[Код Продукта] = V.[Код Продукта] 
                         and T.[Филиал Отгрузки] = V.[Филиал Отгрузки] 
                         and T.Покупатель = V.Покупатель
                         and T.[Фортмат Точки] = M.[Фортмат Точки] )  
            end    
    

FROM t_Promo V left join t_M  M 
   ON V.[Код Продукта] = M.[Код Продукта] 
  and V.[Филиал Отгрузки] = M.[Филиал Отгрузки]
  and V.Покупатель = M.Покупатель
  --and V.[Фортмат Точки] = M.[Фортмат Точки]


Вроде все считает правильно
4 май 16, 19:47    [19135285]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос, хитрое объединение  [new]
iljy
Member

Откуда:
Сообщений: 8711
Юра613,

видите, как важно правильно задать вопрос :) а что касается запроса - я бы попробовал переписать так
SELECT V.[Филиал Отгрузки]
    , V.Покупатель
    , M.[Фортмат Точки]
    , V.[Код Продукта]
    , V.Наименование
    , дата
    --, V.Количество
    --, V.[Фортмат Точки] 
    , Val = ISNULL(t.количество, V.Количество)
FROM t_Promo V left join t_M  M 
		   ON V.[Код Продукта] = M.[Код Продукта] 
				and V.[Филиал Отгрузки] = M.[Филиал Отгрузки]
				and V.Покупатель = M.Покупатель
  left join t_RegVal T ON
	    V.[Фортмат Точки] != M.[Фортмат Точки]
		and T.[Код Продукта] = M.[Код Продукта] 
        and T.[Филиал Отгрузки] = M.[Филиал Отгрузки] 
        and T.Покупатель = M.Покупатель
        and T.[Фортмат Точки] = M.[Фортмат Точки]  
4 май 16, 20:16    [19135355]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос, хитрое объединение  [new]
Юра613
Member

Откуда:
Сообщений: 101
iljy, Спасибо

А можете пояснить что это за хитрый код такой?

 V.[Фортмат Точки] != M.[Фортмат Точки]
5 май 16, 10:17    [19136966]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос, хитрое объединение  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31978
Юра613
iljy, Спасибо

А можете пояснить что это за хитрый код такой?

 V.[Фортмат Точки] != M.[Фортмат Точки]
Вы в оригинальном запросе берёте данные из таблицы t_RegVal, только если V.[Фортмат Точки] не равно M.[Фортмат Точки]
Вот это и перенесено в условие джойна
5 май 16, 10:29    [19137007]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос, хитрое объединение  [new]
iljy
Member

Откуда:
Сообщений: 8711
Юра613
iljy, Спасибо

А можете пояснить что это за хитрый код такой?

 V.[Фортмат Точки] != M.[Фортмат Точки]


Он не хитрый, просто проверка на неравенство. Вообще по стандарту скуля это записывается как <>, но мс-скуль (да и большинство современных, насколько я знаю) понимает оба синтаксиса, а мне как плюсовику проще писать так.
5 май 16, 12:32    [19137863]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос, хитрое объединение  [new]
Юра613
Member

Откуда:
Сообщений: 101
iljy,

ясно. В общем этот оператор != аналог <>

Спасибо, за помощь!
5 май 16, 12:38    [19137907]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить