2014-01-13 75 views
0

我有一個SQL Server數據庫(2012年快遞)與許多表。 我根據不同的基礎表組合,產生了三種不同的視圖。 這些視圖中的每一個由三​​列組成,年份,月份&合計 3個視圖中的每一箇中的總列都是不同的度量。 我希望能夠做的是三個彙總合併成一個單一的視圖結合多個SQL視圖年和月

我曾與下面的腳本嘗試這一點 -

SELECT b.[Year], b.[Month], b.Fees AS [Billing], 
     f.Estimate AS [Estimate], 
     w.Fees AS [WIP] 

FROM MonthlyBillingTotals AS b 

FULL JOIN MonthlyFeeEstimates AS f 
ON (b.[Year] = f.[Year] AND b.[Month] = f.[Month]) 

FULL JOIN MonthlyInstructionsWIP AS w 
ON (b.[Year] = w.[Year] AND b.[Month] = w.[Month]) 

ORDER BY b.[Year], b.[Month] 

本來我想內部連接。當然,除非年度/ Month組合存在於第一個視圖(MonthlyBillingTotals)中,那麼它不會出現在組合查詢中。因此,我嘗試了FULL JOINS,但是這裏的問題是我在Year和Month列中得到了一些NULLS,當它們不存在於第一個視圖(MonthlyBillingTotals)中時。

如果在三個視圖中的數據如下 -

enter image description here

然後,我要的是 -

enter image description here

更妙的是(如果可能的話) -

enter image description here

與填充

回答

2

你可以嘗試建立月/年,從使用UNION子查詢的表的完整列表,然後用它來驅動你的加入...事情是這樣的:

SELECT a.[Year], a.[Month], b.Fees AS [Billing], 
     f.Estimate AS [Estimate], 
     w.Fees AS [WIP] 

FROM (SELECT a.[Year], a.[Month] FROM MonthlyBillingTotals AS a 
     UNION 
     SELECT b.[Year], b.[Month] FROM MonthlyFeeEstimates AS b 
     UNION 
     SELECT c.[Year], c.[Month] FROM MonthlyInstructionsWIP AS c) AS a 

LEFT OUTER JOIN MonthlyBillingTotals AS b 
ON (a.[Year] = b.[Year] AND a.[Month] = b.[Month]) 

LEFT OUTER JOIN MonthlyFeeEstimates AS f 
ON (a.[Year] = f.[Year] AND a.[Month] = f.[Month]) 

LEFT OUTER JOIN MonthlyInstructionsWIP AS w 
ON (a.[Year] = w.[Year] AND a.[Month] = w.[Month]) 

ORDER BY a.[Year], a.[Month] 
+0

生成以下錯誤消息4104,級別16,狀態1,行14 無法綁定多部分標識符「a.Year」。 Msg 4104,Level 16,State 1,Line 14 無法綁定多部分標識符「a.Month」。 Msg 4104,Level 16,State 1,Line 17 無法綁定多部分標識符「a.Year」。 Msg 4104,Level 16,State 1,Line 17 無法綁定多部分標識符「a.Month」。 – PJW

+0

立即嘗試..有點拼寫錯誤..語法未經測試,但一般的想法應該給你你需要的東西.. – StevieG

+0

哦,並根據你使用的數據庫,你應該能夠取代NULLS'0'使用合併或NVL .. – StevieG

0

缺少的幾個月裏,你可以設置與年份和月份小日表和左的連接與意見,並使用ISNULL(variable,0)功能以0替換NULL的另一種選擇,而不是一個日期表將使用公共表格表達式來生成要加入的日期範圍。無論如何,我建議你查看日期表(或數字表),它可以是一個非常有用的工具。

編輯:增加了關於如何日期表可以(供參考)來創建了一個例子:

declare @year_month table (y int, m int) 

;with cte as (
    select cast('2000-01-01' as datetime) date_value 
    union all 
    select date_value + 1 
    from cte 
    where date_value + 1 < '2010-12-31' 
) 

insert @year_month (y, m) 
select distinct year(date_value), month(date_value) 
from cte 
order by 1, 2 
option (maxrecursion 0) 

select * from @year_month 
+0

我考慮過這個選項,但是這並不意味着年/月表必須每月手動更新一次嗎? – PJW

+0

@PJW您可以輕鬆地爲將來的長距離構建日期表,並在從中選擇時使用where子句來過濾您目前感興趣的範圍。 – jpw

+0

你會如何建議我初始化年/月表中的值?這可能是很多手動輸入。 – PJW

0

這是完全未經測試,但看這樣能否解決您的問題:

​​

如果找不到任何內容,則合併功能將置入'0'值,並且在年和月匹配時,左連接只應加入MonthlyFeeEstimates和MonthlyInstructionsWIP的部分內容。

+0

當b。[Year]或b。[Month]爲NULL時,這似乎省略了一些數據 – PJW