C # DataSet Designer - AccesDB - объединить две строки в одну - PullRequest
1 голос
/ 31 марта 2019

Мне нужна ваша помощь с SQL-запросом, который я пытаюсь построить в C # Dataset Query Builder ...

SELECT HouseHold.HHID, Client.FIRST_NAME, Client.LAST_NAME 
FROM ((Client 
INNER JOIN HouseHold_Client ON Client.CID = HouseHold_Client.CID) 
INNER JOIN HouseHold ON HouseHold_Client.HHID = HouseHold.HHID)

Приведенный выше код дает мне список всех HouseHolds (их ID) с клиентамипринадлежность к ним:

HHID  |  FIRST_NAME |  LAST_NAME
------------------------------
1     |  Penelope   |  Grant
1     |  Brian      |  Dyer
2     |  James      |  Newman
2     |  Richard    |  Parsons

.. но я не могу понять, как заставить людей, принадлежащих к тому же HouseHold, отображаться в одной строке, например, для представления таблицы данных позже:

HHID | I_FIRST_NAME | I_LAST_NAME | II_FIRST_NAME | II_LAST_NAME
-----------------------------------------------------------------
1    | Penelope     | Grant       | Brian         | Dyer
2    | James        | Newman      | Richard       | Parsons

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

Любая помощь очень ценится ... Большое спасибо, AD

1 Ответ

0 голосов
/ 31 марта 2019

Поскольку у вас есть только 2 человека на домохозяйство, вы можете использовать этот трюк, чтобы получить минимальный и максимальный идентификатор клиента на домохозяйство.Это делается в подзапросе.

SELECT
    X.HHID,
    C1.FIRST_NAME AS I_FIRST_NAME, C1.LAST_NAME AS I_LAST_NAME,
    C2.FIRST_NAME AS II_FIRST_NAME, C2.LAST_NAME AS II_LAST_NAME
FROM
    ((  SELECT
            HHID, Min(CID) AS MinCId, IIf(Max(CID)=Min(CID), Null, Max(CID))  AS MaxCId
        FROM HouseHold_Client
        GROUP BY HHID
    ) X
    INNER JOIN Client AS C1
        ON X.MinCId = C1.CID)
    LEFT JOIN Client AS C2
        ON X.MaxCId = C2.CID;

Цель выражения IIf() - вывести максимальный идентификатор клиента, только если он отличается от минимального идентификатора клиента.Чтобы также вернуть запись, когда MaxCId равен Null, требуется LEFT JOIN для C2.

Я не присоединился к таблице HouseHold здесь, поскольку нам нужен только HHIDиз него, который также доступен в HouseHold_Client.Конечно, вы также можете присоединиться к нему, если вам нужны другие столбцы из него.


Подзапрос:

(  SELECT
        HHID, Min(CID) AS MinCId, IIf(Max(CID)=Min(CID), Null, Max(CID))  AS MaxCId
    FROM HouseHold_Client
    GROUP BY HHID
) X

Подзапросы должны быть заключены в круглые скобки и иметь имя (здесьX).X действует как обычная таблица со столбцами HHID, MinCId и MaxCId в основном запросе.Он сгруппирован по HHID.Т.е. он возвращает одну строку за HHID.Min(CID) возвращает наименьшее CID и Max(CID) наибольшее CID на HHID.

В случае, если у вас есть 2 клиента на HHID, это означает, что Min и Max даст эти 2 клиента.Если у вас только 1 клиент, то и Min, и Max вернут одного и того же клиента.В этом случае IIf вернет Null вместо Max(CID), чтобы избежать двойного возврата одного и того же клиента.

...