Объединить две строки, содержащие один и тот же идентификатор, но разные данные, в одну строку - PullRequest
0 голосов
/ 04 сентября 2011

У меня к вам очень сложный вопрос

Предположим, у меня есть следующие таблицы

Таблица AccountType :

Id       Type
 1     Checking
 2      Savings 

Таблица Customer_Account :

Customer_Id      Account_Type_Id
    450                 1
    450                 2
    451                 1

Таблица Customer_Account содержит список идентификаторов клиентов с идентификаторами их типов учетных записей. Account_Type_Id - это внешний ключ, полученный из AccountType.Id.

Предположим, что в таблице Customer_Account клиент по имени Josh (id 450) может иметь и чековый и сберегательный счета, как показано выше. Я могу вывести этого клиента с его идентификатором и типом учетной записи, например, дважды введя СЛЕВОЕ СОЕДИНЕНИЕ в таблицу AccountType :

SELECT CustAccount.Customer_Id AS Id, Account1.Type AS Account_Type_1, Account2.Type AS Account_Type_2
FROM Customer_Account CustAccount
LEFT JOIN AccountType Account1
ON Account1.Id = CustAccount.Account_Type_Id
LEFT JOIN AccountType Account2
ON Account2.Id = CustAccount.Account_Type_Id

Вывод будет:

 Id        Account_Type_1         Account_Type_2           
450           Checking               Checking 
450           Savings                Savings
451           Checking               Checking   

То, что я пытаюсь сделать, это то, что если у клиента, такого как Джош (id 450), есть оба чекового и сберегательного счета, я хочу вывести две строки данных выше в одну строку, как так:

 Id        Account_Type_1      Account_Type_2
450           Checking            Savings

А также, если у клиента есть только один тип учетной записи (например, клиент с идентификатором 451 здесь), я хочу, чтобы в соответствующем столбце отображался только этот тип учетной записи, например:

 Id        Account_Type_1      Account_Type_2
451           Checking            

Или, если у клиента с идентификатором 451 был только Сберегательный счет, выход должен быть:

Id        Account_Type_1      Account_Type_2
451                              Savings

Я хочу, чтобы «Проверка» отображалась только в Accoun_Type_1 и «Экономия» в Account_Type_2. Если я сделаю GROUP BY CustAccount.Customer_Id, я получу это:

 Id        Account_Type_1      Account_Type_2
450           Checking            Checking
451           Checking            Checking

Любая помощь от любого эксперта будет очень признательна.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 04 сентября 2011

Это выглядит как прямое приложение для FULL OUTER JOIN:

SELECT COALESCE(ac1.id, ac2.id) AS id, ac1.Account_Type_1, ac2.Account_Type_2
  FROM (SELECT c.Customer_ID AS Id, t.Type AS Account_Type_1
          FROM Customer_Account AS c
          JOIN AccountType      AS t ON c.Account_Type_ID = t.ID AND t.ID = 1) AS ac1
  FULL OUTER JOIN
       (SELECT c.Customer_ID AS Id, t.Type AS Account_Type_2
          FROM Customer_Account AS c
          JOIN AccountType      AS t ON c.Account_Type_ID = t.ID AND t.ID = 2) AS ac2
    ON ac1.Id = ac2.Id;

Если ваша СУБД не поддерживает FULL OUTER JOIN, но поддерживает LEFT OUTER JOIN, то вы можете использовать:

SELECT ac0.id, ac1.Account_Type_1, ac2.Account_Type_2
  FROM (SELECT DISTINCT c.Customer_ID AS Id FROM Customer_Account AS c) AS ac0
  LEFT OUTER JOIN
       (SELECT c.Customer_ID AS Id, t.Type AS Account_Type_1
          FROM Customer_Account AS c
          JOIN AccountType      AS t ON c.Account_Type_ID = t.ID AND t.ID = 1) AS ac1
    ON ac0.id = ac1.id
  LEFT OUTER JOIN
       (SELECT c.Customer_ID AS Id, t.Type AS Account_Type_2
          FROM Customer_Account AS c
          JOIN AccountType      AS t ON c.Account_Type_ID = t.ID AND t.ID = 2) AS ac2
    ON ac0.Id = ac2.Id;

Первый подзапрос генерирует список существующих идентификаторов клиентов;вторая генерирует список для типа счета 1 (Проверка);третий генерирует список для типа счета 2 (Сохранение).Объединения обеспечивают правильное распознавание каждой учетной записи.

1 голос
/ 04 сентября 2011

Добавление дополнительных условий к вашим предложениям ON:

ON Account1.Id = CustAccount.Account_Type_Id and Account1.Account_Type_Id = 1

ON Account2.Id = CustAccount.Account_Type_Id and Account2.Account_Type_Id = 2

приведет к выводу, который включает в себя счета, принадлежащие клиенту. Если у них есть только одна учетная запись, тогда другой тип учетной записи будет NULL.

Редактировать: Извините, я не понял, что у вас нет таблицы клиентов. Вы можете создать временную таблицу со списком различных значений Customer_Id и использовать ее в качестве первой таблицы в ваших JOIN.

select distinct Customer_Id into #Customers
    from Customer_Account

Или намного проще:

select distinct C.Customer_Id,
    ( select 'Checking' from Customer_Account where Customer_Id = C.CustomerId and Account_type_Id = 1 ) as Account_Type_1,
    ( select 'Savings' from Customer_Account where Customer_Id = C.CustomerId and Account_type_Id = 2 ) as Account_Type_2,
    from Customer_Account as C
1 голос
/ 04 сентября 2011

я думаю это должно помочь вам

1 : Sql Выберите вопрос запроса.Объединить строки или

это должно помочь вам

...