【问题标题】:Sum on Multiple Left Joins对多个左连接求和
【发布时间】:2019-09-03 04:36:25
【问题描述】:

我试图在多次左连接后对特定 ID 的列的总值求和。

下面的代码为我提供了我正在寻找的内容,但在多行中,我需要合计 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

我希望它为唯一 ID 返回一行,其中包含特定日期的总 C_Amount 和总 D_Amount

【问题讨论】:

  • SELECT SUM(C_Amount), SUM(D_AMOUNT) 有什么问题?

标签: sql join sum teradata


【解决方案1】:

使用 group by 聚合

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

【讨论】:

  • 我之前试过这个,我得到以下失败原因“SELECT Failed. 3504: Selected non-aggregate values must be part of the associated group.” 所以我不确定究竟是什么导致了这个
  • 道歉-我从我的选择中取出了 T1.ID,现在这已经奏效了。是否可以在选择中保留原始 ID 而不仅仅是唯一 ID?
  • 查询输出中的每一列都必须在您的 group by 子句中,或者聚合(sum、min、max 等)。在这种情况下,听起来您只需将其添加到您的组中即可。
【解决方案2】:

我会这样做。由于 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

【讨论】:

    【解决方案3】:

    我会添加一对多导致错误总数的担忧。如果表 3 对于给定的 T2.UniqueID 有 10 条记录,而对于 T4 表有另外 5 条记录会怎样。您刚刚复合了您的总数,完全超出了范围。

    因此,我将从按日期过滤的唯一 ID 分组的子表中预先聚合。此外,由于关联属性,您可以删除 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 中有多少条记录适用?如果您在 T1 中有 5k 行并且表 T3 和 T4 之间总共只有 450 个条目,那么您的结果集仍然会为您提供所有行。话虽如此,您可能不希望在辅助总和子查询中没有任何此类详细信息的记录膨胀。我会在最后添加一个 WHERE 子句

       WHERE
              T3.Unique_ID IS NOT NULL
          OR  T4.Unique_ID IS NOT NULL
    

    【讨论】:

      猜你喜欢
      • 2021-09-14
      • 2015-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      • 2021-10-21
      • 2019-01-07
      • 1970-01-01
      相关资源
      最近更新 更多