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

Откуда:
Сообщений: 16
Здравствуйте.
Можно ли задействовать (и как) в цикле Left Join?

SELECT *
  FROM      (SELECT f1, f2 FROM tbl1 WHERE f3 = '2018') AS t1 
  LEFT JOIN (SELECT f1, f2 FROM tbl1 WHERE f3 = '2019') AS t2 ON t2.f1 = t1.f1
  LEFT JOIN (SELECT f1, f2 FROM tbl1 WHERE f3 = '2020') AS t3 ON t3.f1 = t1.f1


Хочу сделать что то на подобии

DECLARE @yr AS INT = 2018

SELECT *
  FROM  (SELECT f1, f2 FROM tbl1 WHERE f3 = @yr) AS t1 

WHILE @yr <= YEAR(GETDATE())+1
 BEGIN
   SET @yr = @yr + 1
   LEFT JOIN (SELECT f1, f2 FROM tbl1 WHERE f3 = @yr) ON f1 = t1.f1
END


но такое не проходит.
можно как то динамически задавать количество джоийнов?

Спасибо.
28 ноя 19, 11:22    [22027411]     Ответить | Цитировать Сообщить модератору
 Re: Left Join в цикле  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30702
dimonovych
можно как то динамически задавать количество джоийнов?
Сформировать запрос как строку, а потом эту строку выполнить.
28 ноя 19, 11:38    [22027435]     Ответить | Цитировать Сообщить модератору
 Re: Left Join в цикле  [new]
dimonovych
Member

Откуда:
Сообщений: 16
Чтоб было более понятно
Есть
f1 f2 f3
1 some data1 2018
2 some data1 2018
3 some data1 2018
1 some data2 2019
2 some data2 2019
3 some data2 2019
1 some data3 2020
2 some data3 2020
3 some data3 2020


Нужно


f1 f2 f3 f1 f2 f3 f1 f2 f3
1 some data1 2018 1 some data2 20191 some data3 2020
2 some data1 2018 2 some data2 20192 some data3 2020
3 some data1 2018 3 some data2 20193 some data3 2020
28 ноя 19, 11:46    [22027442]     Ответить | Цитировать Сообщить модератору
 Re: Left Join в цикле  [new]
iiyama
Member

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

ищите по слову PIVOT
вопрос всплывает каждую неделю по 3 раза
28 ноя 19, 12:37    [22027502]     Ответить | Цитировать Сообщить модератору
 Re: Left Join в цикле  [new]
dimonovych
Member

Откуда:
Сообщений: 16
iiyama
dimonovych,

ищите по слову PIVOT
вопрос всплывает каждую неделю по 3 раза


Искал.
Насколько я понял PIVOT может сделать так:

f1 f2 2018 2019 2020
1 some data1505560
2 some data160 5040
3 some data1404550


Как с его помощью получить мой варпиант - я не нашел
28 ноя 19, 13:02    [22027546]     Ответить | Цитировать Сообщить модератору
 Re: Left Join в цикле  [new]
dimonovych
Member

Откуда:
Сообщений: 16
alexeyvg
dimonovych
можно как то динамически задавать количество джоийнов?
Сформировать запрос как строку, а потом эту строку выполнить.

Спасибо.
Пока так и сделал.
28 ноя 19, 13:03    [22027548]     Ответить | Цитировать Сообщить модератору
 Re: Left Join в цикле  [new]
msLex
Member

Откуда:
Сообщений: 7726
select 
  -- 2018
  f1 
  , f2 =  max(case f3 when 2018 then f2 end)
  , f3 =  max(case f3 when 2018 then f3 end)

  --2019
  , f1 
  , f2 =  max(case f3 when 2019 then f2 end)
  , f3 =  max(case f3 when 2019 then f3 end)

  --2020
  , f1 
  , f2 =  max(case f3 when 2020 then f2 end)
  , f3 =  max(case f3 when 2020 then f3 end)
from ... 
group by  f1
28 ноя 19, 13:07    [22027553]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить