【问题标题】:SQL: Left Outer Join, different GROUP BY, need to replicate records ?SQL:左外连接,不同的GROUP BY,需要复制记录吗?
【发布时间】:2011-10-31 19:59:12
【问题描述】:

我在两个表(A、B)中有关于帐户的信息。 A 中的记录在账户级别(account_id)都是唯一的,但在表 B 中,账户是由 account_id 和 month_start_dt 标识的,因此每个账户可能存在零个或多个月。

问题是,当我将外部连接 A 留给 B 时,连接表包含来自 A 的所有记录以及来自 B 的记录(按帐户、按月份),对于给定月份,表 B 中不存在的任何帐户都会包含没有那个月的记录。

期望的结果:如果给定月份的表 B 中不存在帐户,则在连接表中为该帐户创建一条记录,其中 month_start_dt 和从 B 中选择的所有变量为 0。

就目前而言,我可以让连接工作,其中所有未出现在 B 中的帐户(在任何月份都没有出现)对于从 B 中选择的所有变量都有 0 值(使用 nvl(variable, 0) )但是,这些帐户只有一条记录。他们每个月应该有一个。

【问题讨论】:

  • 您可以发布您尝试过的查询吗?
  • 我不确定我是否可以。我在工作,我不知道法律认为什么是专有的。我将尝试构建一个不引用任何字段名或表名的示例。

标签: sql join


【解决方案1】:

创建一个临时表,其中包含您想要的不存在行的记录数,并右连接第一个查询的结果。

select tbl.* from ( select * from A left join B on a.col1 = b.col2) tbl join tmpTable on tbl.col2 = tmpTable.zerocol

试试这个。

【讨论】:

  • 你是对的。我刚刚意识到,交叉加入月份列表中的帐户列表会给出一个可以毫无问题地留在表 B 上的表。
【解决方案2】:

我不明白为什么您需要外连接。这使用标准 SQL 的 EXCEPT(Oracle 中的 MINUS):

SELECT account_id, month_start_dt, all_variables 
  FROM B
UNION
(
 SELECT account_id, month_start_dt, 0 AS all_variables
   FROM A 
        CROSS JOIN (
                    SELECT DISTINCT month_start_dt
                      FROM B
                   ) AS DT1
 EXCEPT 
 SELECT account_id, month_start_dt, 0 AS all_variables
   FROM B
);

【讨论】:

    【解决方案3】:

    您可以使用计数日历表,其中包含几个月(几年)。看到这个类似的问题:How to create a Calender table for 100 years in Sql

    然后有:

    FROM 
            A
        CROSS JOIN
            ( SELECT y
                   , m
              FROM Calendar
              WHERE (   y = @start_year
                    AND m >= @start_month
                    )
                 OR (   y > @start_year
                    AND y < @end_year
                    )
                 OR (   y = @end_year
                    AND m <= @end_month
                    )
            ) AS C
        LEFT JOIN
            B
                ON  B.account_id = A.account_id
                AND YEAR(B.start_date) = C.y
                AND MONTH(B.start_date) = C.m
    

    【讨论】:

      猜你喜欢
      • 2011-02-07
      • 2014-11-18
      • 2019-01-15
      • 2015-02-28
      • 1970-01-01
      • 2013-03-03
      • 2013-03-24
      • 2013-03-15
      相关资源
      最近更新 更多