2015-12-21 91 views
0

我目前被困在一個SQL相關的問題上,我希望我能找到你們之間的幫助。 這是我的問題: 我有一個事實表,列DATE,B和C是關鍵,而VALUE是事實值。 我也有一個參考日曆表。 。 我想要的是,爲每個現有的元組BC,和我的日曆中的每個日期(即使沒有其實在這個日期,檢索行SQL,日曆和主鍵

舉例來說,假設我有:

Calendar (DD-MM-YYYY) 
01-01-2015 
02-01-2015 
03-01-2015 

和事實

Date  | B | C | VALUE 
============================= 
02-01-2015 | aa | xx | 10 
02-01-2015 | aa | yy | 15 
03-01-2015 | aa | xx | 10 

我想:

01-01-2015 | aa | xx | 0 
01-01-2015 | aa | yy | 0 
02-01-2015 | aa | xx | 10 
02-01-2015 | aa | yy | 15 
03-01-2015 | aa | xx | 10 
03-01-2015 | aa | yy | 0 

如何庫侖d我以高效的方式做到這一點?

在此先感謝您提供的任何幫助。

回答

0

首先創建笛卡爾積calendar日期與和B唯一值CFACT

然後Outer join`` the result of first step with fact`表得到的結果

嘗試這樣

;WITH cte 
    AS (SELECT Ca.dates, C, B 
     FROM (SELECT DISTINCT C, B 
       FROM fact) A 
       CROSS JOIN calendar Ca) 
SELECT A.dates, 
     A.B, 
     A.C, 
     Isnull(F.value,0) as value 
FROM cte A 
     LEFT OUTER JOIN fact F 
        ON A.dates = f.dates 
         AND A.C = F.C 
         AND A.B = F.B 
+0

感謝的東西你,這正是我需要的!您是否選擇將笛卡爾產品表創建爲臨時表(帶有「with」)而不是使用子查詢,因爲它更高效,或者僅僅因爲它更具可讀性? – WalterWhite

+0

它更** **可讀** –