SQL сложный метод соединения - PullRequest
0 голосов
/ 11 июня 2018

Я боролся с определенным разделом большого запроса, который я строю.В основном он пытается разместить банковские реквизиты сотрудников не более чем в трех столбцах в зависимости от того, используются ли они один, два или три банковских счета.

My Quandry

Я используюSQL-сервер Azure через VisualStudio.

Контекст базы данных - это набор параметров занятости, банковской информации, налоговой информации, которые необходимо объединить и экспортировать, а затем передать в API.Я построил таблицы из старых .csv из старых старых серверов interbase, поэтому иногда первичные ключи имеют некоторую неясность, но каждая строка уникальна, поэтому выбор можно обойти.

Я не могу ничего найтиза последние несколько дней в сети и надеялся, что кто-нибудь сможет просто указать мне правильное направление.Я не прошу код здесь.

Есть предложения?Ура!

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Хитрость заключается в повороте, поэтому я покажу, как это сделать - здесь с условным агрегированием:

select t2.empid,
       max(case when seqnum = 1 then accountno end) as accountno_1,
       max(case when seqnum = 1 then bsb end) as bsb_1,
       max(case when seqnum = 2 then accountno end) as accountno_2,
       max(case when seqnum = 2 then bsb end) as bsb_2,
       max(case when seqnum = 3 then accountno end) as accountno_3,
       max(case when seqnum = 3 then bsb end) as bsb_3
from (select t2.*,
             row_number() over (partition by empid order by accountno) as seqnum
      from table2 t2
     ) t2
group by empid;

Я позволю вам выяснить, как объединить остальную информацию.Это действительно не так сложно.

Кроме того, обратите внимание, что первоначальное упорядочение учетной записи не сохраняется.Таблицы SQL представляют неупорядоченные наборы.Вы не показали ни одного столбца, который фиксирует исходный заказ, поэтому это заказы по номеру счетаЕсли у вас есть столбец заказа, используйте его в order by.

0 голосов
/ 11 июня 2018

Вы не указали, какая база данных, поэтому я попробую "в основном" универсальное решение.Вам нужно будет настроить этот SQL в соответствии с конкретным синтаксисом вашей базы данных.Вот выстрел:

select
    e.empid, e.name,
    a1.accountno as Account1, a1.bsb as BSB1,
    a2.accountno as Account2, a2.bsb as BSB2,
    a3.accountno as Account3, a3.bsb as BSB3
  from employee e
  left join (
    select accountno, bsb from account x1 where x1.empid = e.empid 
      limit 1
    ) a1
  left join (
    select accountno, bsb from account x2 where x2.empid = e.empid
      and x2.accountno not in (x1.accountno) 
      limit 1
    ) a2
  left join (
    select accountno, bsb from account x3 where x3.empid = e.empid 
      and x3.accountno not in (x1.accountno, x2.accountno) 
      limit 1
    ) a3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...