2015-12-21 8 views
0

Je suis actuellement bloqué sur un problème lié à SQL, et j'espère que je trouverai de l'aide parmi vous. Voici mon problème: J'ai une table de faits, avec la colonne DATE, B et C étant la clé, et VALUE étant la valeur de fait. J'ai aussi une table de calendrier de référence. . Ce que je veux, pour chaque BC tuple existant, et pour chaque date de mon agenda (même s'il n'y a pas fait à cette date, récupérer une ligneSQL, calendrier et clé primaire

Par exemple, supposons que j'ai:

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

et de fait

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

Je veux:

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 

Comment coul d Je le fais de manière efficace?

Merci d'avance pour toute aide que vous pouvez fournir.

Répondre

0

d'abord créer le produit cartésien calendar dates avec des valeurs uniques de B et C colonne FACT Table

Ensuite Outer join`` the result of first step with table fact` pour obtenir le résultat

Essayez quelque chose comme ça

;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

Remerciez vous, c'est exactement ce dont j'ai besoin! Avez-vous choisi de créer la table des produits cartésiens en tant que table temporaire (avec un "avec") au lieu d'utiliser une sous-requête parce qu'elle est plus efficace, ou simplement parce qu'elle est plus lisible? – WalterWhite

+0

c'est plus ** lisible ** –