0

だから私はこれが死ぬまで行われたことを知っていますが、必要な正確な答えを見つけることができないので、これを行う方法の代替案について聞いてうれしいです.

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 年の値 (月が一致する場所) を表示するテーブルです。

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 月)

ここで、月が一致している理由は、年、半年、または四半期で結合すると、すべてのデータが前の列で重複するためです。私が探しているのは、データが一致する場合は、前年対前年の収益を表示し、年に存在するが前年に存在しない場合は、null prev_rev を表示し、その逆も同様です。

誰かが助けてくれることを願っています:) よろしくお願いします。

4

1 に答える 1

0

私はあなたの問題であなたを正しい(私見)方向に向けようとします.
最初に、表示したい clientIds と日付のリストを含むテーブル/ビューを作成してみます。
したがって、少なくとも月に 1 回レポートする場合は、クライアントごとに月に 1 つのレコードが必要になります。
簡単にするために、このビュー/テーブルが作成され、NewTimeTableClient と呼ばれると仮定しています。
そこから、2 つの外部結合を実行して、昨年と今年のデータを取得できます。
また、合計に対応するためにグループ化が必要になると思います(そうしないと、合計は sales テーブルの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
于 2013-10-03T07:30:11.017 に答える