OUTER JOIN无法按预期工作

时间:2013-10-03 07:04:54

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

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

在SQL Server 2008R2中 我有一个客户ID,年,月&收入,我正在做一个完整的外部加入,因为我想制作一些看起来像这样的东西:

Client_ID , Year, Month Revenue, 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,反之亦然。

希望有人可以帮忙:) 提前谢谢。

1 个答案:

答案 0 :(得分:0)

我会试着用你的问题引导你走向正确(imho)的方向 我首先尝试创建一个表/视图,其中包含您要显示的clientId和日期列表。
因此,如果您想每月至少报告一次,则每个客户/月需要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