Как присоединиться к таблице и агрегировать данные по полю, отличному от ключа

Я пытаюсь объединить несколько таблиц в Dynamics AX и получить всю информацию по A.PARTYID в 1 строке. Однако я должен присоединиться к другим таблицам в более подробных отношениях.

В настоящее время я пытаюсь таким образом присоединиться к следующим таблицам:

SELECT 
A.PARTYID
,C.EMAIL
,C.PHONE
,C.RECID
FROM DIRPARTYTABLE A

LEFT JOIN DIRPARTYECOMMUNICATIONRELA2608 B
ON B.PARTYID = A.PARTYID

LEFT JOIN DIRECOMMUNICATIONADDRESS C
ON C.RECID = B.RECID

WHERE
B.PARTYID = 00000225

И вот результат:

PARTYID     MAIL                PHONE         RECID
000000225   asdf@gmail.com      NULL          5637146657
000000225   NULL                0612345678    5637176698

Однако я хочу агрегировать информацию по PARTYID и опустить RECID, поскольку меня это не интересует, например:

PARTYID     MAIL                PHONE         
000000225   asdf@gmail.com      0612345678    

Есть ли у кого-нибудь предложение, как я могу настроить код, чтобы он работал?

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

С уважением, Игорь

Можете ли вы предоставить образцы данных? Думаю, проблема в ваших данных, а не в вашем запросе? Почему у вас есть отдельные строки для хранения номера телефона и адреса электронной почты? Они должны быть в один ряд.

Larnu 31.10.2018 13:44

Привет. "агрегировать информацию по PARTYID и опускать RECID" неясно. Также не ясно из вашего примера желаемый результат. Пожалуйста, прочтите и действуйте в соответствии с минимальный воспроизводимый пример. Это включает четкую спецификацию. PS Узнайте, что возвращает LEFT JOIN: строки INNER JOIN плюс несопоставленные строки левой таблицы, расширенные на NULL. Всегда знайте, какое ВНУТРЕННЕЕ СОЕДИНЕНИЕ вы хотите как часть ЛЕВОГО СОЕДИНЕНИЯ. WHERE или ON, требующие, чтобы правый столбец таблицы не был NULL после LEFT JOIN ON, удаляет все строки, расширенные NULL, т.е. оставляет только строки INNER JOIN, т.е. «превращает LEFT JOIN во INNER JOIN». Это у тебя есть.

philipxy 31.10.2018 19:50
1
2
51
2

Ответы 2

Разве ты не можешь просто

SELECT 
      A.PARTYID
     ,MAX(C.EMAIL) Email
     ,MAX(C.PHONE) Phone
FROM DIRPARTYTABLE A
LEFT JOIN DIRPARTYECOMMUNICATIONRELA2608 B
ON B.PARTYID = A.PARTYID
LEFT JOIN DIRECOMMUNICATIONADDRESS C
ON C.RECID = B.RECID
WHERE
B.PARTYID = '00000225' --00000225 is a string not a number
GROUP BY A.PARTYID;

Это должно работать

SELECT  SQ1.PARTYID,
        MAX(SQ1.MAIL) AS Mail,
        MAX(SQ1.PHONE) AS Phone
FROM    (
            VALUES  ('000000225','asdf@gmail.com',NULL,5637146657),
                    ('000000225',NULL,'0612345678',5637176698)
        ) AS SQ1(PARTYID,MAIL,PHONE,RECID)
GROUP   BY SQ1.PARTYID;

Как я вижу это 2 месяца назад?

Ilyes 31.10.2018 13:43

Хорошо, это действительно дает мне результат, который я хочу, однако теперь я выбрал только PARTID 00000225, но на самом деле у меня есть таблица с полмиллионом записей. Есть ли способ сделать это динамически?

titatovenaar 31.10.2018 14:11

Ответ Сами, он отредактировал его в соответствии с вашей схемой / исходным запросом, вам просто нужно удалить из него предложение where, чтобы вернуть все идентификаторы других сторон.

Dohsan 31.10.2018 14:15

Другие вопросы по теме