Сумма по нескольким левым соединениям - PullRequest
0 голосов
/ 12 апреля 2019

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

Приведенный ниже код дает мне то, что я ищу, но в нескольких строках мне нужно, чтобы значение T3.C_Amt и T4.E_Amt было суммировано.

SELECT
      T1.ID,
      T2.Unique_ID,
      T3.C_Date,
      T3.C_Amount,
      T4.D_Date,
      T4.D_Amount
   FROM 
      TABLE_1 T1
         LEFT JOIN DATABASE1.TABLE_2 T2
            ON T1.ID = T2.UNIQUE_ID
            LEFT JOIN DATABASE1.TABLE_3 T3
               ON T2.Unique_ID = T3.Unique_ID
              AND T3.C_Date = '2019-04-11'
            LEFT JOIN DATABASE1.TABLE_4 T4
               ON T2.Unique_ID = T4.Unique_ID 
              AND T4.D_Date= '2019-04-11'


--this needs to be summed to have the total amount

Я хочу вернуть одну строку для уникального идентификатора с общей суммой C_Amount и общей суммой D_Amount на конкретную дату

Ответы [ 3 ]

0 голосов
/ 12 апреля 2019

Я бы сделал это так.Поскольку Teradata является MPP, не должно быть большого влияния на производительность.

    SELECT Unique_ID,C_Date,sum(C_Amount),D_Date,sum(D_Amount)
FROM
(
SELECT
      T1.ID ID,
      T2.Unique_ID Unique_ID,
      T3.C_Date C_Date,
      T3.C_Amount C_Amount,
      T4.D_Date D_Date,
      T4.D_Amount D_Amount
   FROM 
      TABLE_1 T1
         LEFT JOIN DATABASE1.TABLE_2 T2
            ON T1.ID = T2.UNIQUE_ID
            LEFT JOIN DATABASE1.TABLE_3 T3
               ON T2.Unique_ID = T3.Unique_ID
              AND T3.C_Date = '2019-04-11'
            LEFT JOIN DATABASE1.TABLE_4 T4
               ON T2.Unique_ID = T4.Unique_ID 
              AND T4.D_Date= '2019-04-11'
) ABC
GROUP BY Unique_ID,C_Date,D_Date
0 голосов
/ 12 апреля 2019

Я бы добавил беспокойство 1-ко-многим, приводящее к ложному итогу.Что если в таблице 3 есть 10 записей для данного T2.UniqueID и еще 5 для таблицы T4.Вы только что суммировали итоговую сумму полностью вне диапазона.

Таким образом, я бы предварительно агрегировал из дочерних таблиц, сгруппированных по уникальному идентификатору, отфильтрованному по дате.Кроме того, вы можете удалить таблицу T2 из-за ассоциативных свойств.

T1.ID = T2.Unique_ID = T3.Unique_ID = T4.Unique_ID
to T1.ID = T3.Unique_ID = T4.Unique_ID


SELECT
      T1.ID,
      T3.C_Date,
      T3.C_Amount,
      T4.D_Date,
      T4.D_Amount
   FROM 
      TABLE_1 T1
         LEFT JOIN 
         ( Select Unique_ID, sum( C_Amount ) as T3Sum
              from DATABASE1.TABLE_3
              where T3.C_Date = '2019-04-11'
              group by Unique_ID ) T3
            ON T1.ID = T3.Unique_ID
         LEFT JOIN 
         ( select Unique_ID, sum( D_Amount ) T4Sum                 
              from DATABASE1.TABLE_4 
              where D_Date= '2019-04-11'
              group by Unique_ID ) T4
            ON T1.ID = T4.Unique_ID 

Теперь ваша неоднозначность в именах таблиц может помочь стать более реальной описательной.Ваши итоговые суммы основаны на одной дате, но сколько записей в T1 применимо?Если у вас есть 5 тыс. Строк в T1 и всего 450 записей между таблицами T3 и T4, ваш набор результатов все равно даст вам все строки.Тем не менее, вы, вероятно, не хотите, чтобы множество записей, которые не имеют таких деталей во вторичных подзапросах суммы.Я бы добавил предложение WHERE в конце

   WHERE
          T3.Unique_ID IS NOT NULL
      OR  T4.Unique_ID IS NOT NULL
0 голосов
/ 12 апреля 2019

Использовать агрегацию с группой по

SELECT T2.Unique_ID,T3.C_Date,sum(T3.C_Amount),
T4.D_Date,sum(T4.D_Amount)
FROM TABLE_1 T1
LEFT JOIN DATABASE1.TABLE_2 T2
ON T1.ID = T2.UNIQUE_ID
LEFT JOIN DATABASE1.TABLE_3 T3
ON T2.Unique_ID = T3.Unique_ID AND T3.C_Date = '2019-04-11'
LEFT JOIN DATABASE1.TABLE_4 T4
ON T2.Unique_ID = T4.Unique_ID AND T4.D_Date= '2019-04-11'
group by T2.Unique_ID,T3.C_Date,T4.D_Date
...