【问题标题】:OUTER JOIN not working as expectedOUTER JOIN 未按预期工作
【发布时间】:2013-10-09 18:39:18
【问题描述】:

所以我知道这已经完成了,但我找不到我需要的确切答案,所以也很高兴听到有关如何做到这一点的替代方案。

在 SQL Server 2008R2 中 我有一个客户 ID、年份、月份和收入,并且我正在执行完全外部联接,因为我想生成如下所示的内容:

Client_ID ,年,月收入,Prev_Year,Prev_Month。 Prev_Revenue。 5003 2011 12 100 2010 12 50 5003 2012 12 120 2011 12 100

我使用的代码是:

SELECT DISTINCT Sales.fin_year
  ,sales.fin_qtr
 ,sales.fin_Half
 ,sales.fin_month    
 ,Sum(sales.rev) AS Rev
 ,Sales.client_name
  ,sales.client_id,
  prev.fin_year AS Prev_Fin_Year
 ,prev.fin_qtr AS Prev_Fin_Qtr
 ,prev.fin_Half AS Prev_Fin_Half
 ,prev.fin_month AS Prev_Fin_Month,
  Sum(prev.rev) AS prev_Rev
FROM Thisismytable Sales
FULL OUTER JOIN
  Thisismytable PREV
   ON PREV.fin_year = DATEADD(Y,-1,sales.fin_year)
   AND prev.fin_qtr = sales.fin_qtr
   AND prev.fin_half = sales.fin_half
   AND (prev.fin_month = sales.fin_month)
   AND PREV.client_id = Sales.client_id

我得到的是一个显示 2011 年数据和之前 2010 年值的表格(月份匹配) 但是当我查看 2012 年时,之前的数据仅存在于 2011 年同月交易完成时,例如

January 2011 = Revenue of $20
January 2012 = Previous revenue of $20

问题是,如果存在 2011 年的值,则它根本不会出现在 2012 年的数据中。 我需要这样的东西:

January 2012 = 100                  Previous Rev =20

2012 年 2 月 = NULL(2012 年根本不存在 2 月数据)上一版本 = 500(对于 2011 年 2 月)

现在,我有月份匹配的原因是,如果我加入一年、半年或 Qtr,我的所有数据都在前一列中重复。我正在寻找的是如果数据匹配,则显示当年与上一年的收入,如果它存在于当年但不上一年,则显示 null prev_rev,反之亦然。

希望有人可以提供帮助:) 提前致谢。

【问题讨论】:

    标签: sql sql-server-2008 join outer-join


    【解决方案1】:

    我会尝试引导您解决您的问题。
    我会首先尝试创建一个表/视图,其中包含您要显示的客户 ID 和日期列表。
    因此,如果您想至少每月报告一次,则每个客户/月需要 1 条记录。
    对于简单我假设这个视图/表被创建并被称为 NewTimeTableClient。
    从那里开始,您可以执行 2 个外部联接来获取去年和当年的数据。
    我还假设您需要一些分组依据来容纳总和(否则您的总和将只是销售表中 1 条记录的总和)。

    结果看起来像这样,我希望它能让你开始。
    并不是说没有不同的(不喜欢使用不同的;)):

    SELECT 
      ttc.client_name
     ,ttc.client_id,
     ,ttc.fin_year
     ,ttc.fin_qtr
     ,ttc.fin_Half
     ,ttc.fin_month    
     ,Sum(CURR.rev) AS RevCurr 
     ,DATEADD(y,-11,ttc.fin_year) AS Prev_Fin_Year
      Sum(prev.rev) AS prev_Rev
    FROM NewTimeTableClient ttc
    LEFT OUTER JOIN Thisismytable PREV
       ON PREV.fin_year = DATEADD(Y,-1,ttc.fin_year)
       AND prev.fin_qtr = ttc.fin_qtr
       AND prev.fin_half = ttc.fin_half
       AND (prev.fin_month = ttc.fin_month)
       AND PREV.client_id = ttc.client_id
    LEFT OUTER JOIN Thisismytable CURR
       ON CURR.fin_year = ttc.fin_year)
       AND CURR.fin_qtr = ttc.fin_qtr
       AND CURR.fin_half = ttc.fin_half
       AND (CURR.fin_month = ttc.fin_month)
       AND CURR.client_id = ttc.client_id
    GROUP BY ttc.client_name
     ,ttc.client_id,
     ,ttc.fin_year
     ,ttc.fin_qtr
     ,ttc.fin_Half
     ,ttc.fin_month
    

    【讨论】:

    • 谢谢你,但我仍然遇到同样的问题如果说一月的数据存在于 2011 年,但在 2012 年一月没有交易,我仍然希望在 2012 年出现一行。本质上我要创建的是一个可以汇总的报告,以便当前收入与 2012 年匹配,之前的收入与 2011 年匹配,然后创建百分比差异。
    • 如果您的 ttc 表有一条记录 clientId X 年 2012 年第 1 个月,那么该记录将在您执行 2 次左外连接后显示。您能否详细说明您如何实现 NewTimeTableClient ttc 表或提供示例数据?
    • 实际上我错过了一些日期,所以它没有按预期工作。你的解决方案第一次就成功了 :) 非常感谢 :)
    • 很好,没问题!随意将我的答案标记为解决方案
    猜你喜欢
    • 1970-01-01
    • 2013-10-07
    • 2016-09-16
    • 2020-01-08
    • 2013-07-12
    • 1970-01-01
    • 2019-08-15
    • 2021-06-04
    • 2022-01-24
    相关资源
    最近更新 更多