2017-07-27 4 views
2

J'ai un 2 tables qui ressemblent à ceci:SQL - Comment traverser-joindre deux tables pour répéter les valeurs

MonthEndDate 
2016-06-30 00:00:00.000 
2016-07-31 00:00:00.000 
2016-08-31 00:00:00.000 
2016-09-30 00:00:00.000 
2016-10-31 00:00:00.000 
2016-11-30 00:00:00.000 
2016-12-31 00:00:00.000 

ET

MonthEndDate    CustomerId Flag 
2016-06-30 00:00:00.000 123   1 
2016-07-31 00:00:00.000 123   1 
2016-08-31 00:00:00.000 123   1 
2016-09-30 00:00:00.000 123   1 

Je voudrais une sortie qui ressemble à ceci:

MonthEndDate    CustomerId  Flag 
2016-06-30 00:00:00.000  123   1 
2016-07-31 00:00:00.000  123   1 
2016-08-31 00:00:00.000  123   1 
2016-09-30 00:00:00.000  123   1 
2016-10-31 00:00:00.000  123   0 
2016-11-30 00:00:00.000  123   0 
2016-12-31 00:00:00.000  123   0 

tableau 1 est une table DimDate qui a mois date de fin.
Tableau


2 est la table CustomerInfo.
Chaque client a un Flag défini sur 1 chaque fois que ce client a une valeur pour la fin de mois donnée.
Je veux obtenir une sortie qui aura chaque mois Date de fin (c'est pourquoi je poursuis DimDate table) et quand un client n'a pas de valeur pour la fin du mois, je veux que le drapeau affiche 0.
I ' m avec SQL Server 2005

Voici quelques exemples de code je:

DECLARE @table1 TABLE 
(
    MonthEndDate DATETIME 
) 

INSERT INTO @table1 
VALUES('2016-06-30 00:00:00.000') 

INSERT INTO @table1 
VALUES('2016-07-31 00:00:00.000') 
INSERT INTO @table1 
VALUES('2016-08-31 00:00:00.000') 
INSERT INTO @table1 
VALUES('2016-09-30 00:00:00.000') 
INSERT INTO @table1 
VALUES('2016-10-31 00:00:00.000') 
INSERT INTO @table1 
VALUES('2016-11-30 00:00:00.000') 
INSERT INTO @table1 
VALUES('2016-12-31 00:00:00.000') 

DECLARE @table2 TABLE 
(
    MonthEndDate DATETIME 
    ,CustomerId INT 
    ,Flag INT 
) 

INSERT INTO @table2 
VALUES('2016-06-30 00:00:00.000',123,1) 

INSERT INTO @table2 
VALUES('2016-07-31 00:00:00.000',123,1) 
INSERT INTO @table2 
VALUES('2016-08-31 00:00:00.000',123,1) 
INSERT INTO @table2 
VALUES('2016-09-30 00:00:00.000',123,1) 

SELECt * FROM @table1 


SELECt * FROM @table2 

Répondre

3

vous avez besoin faire CROSS JOIN pour obtenir toutes les combinaisons de MonthEndDate et CustomerId. Quand vous avez cela, faire un LEFT JOIN sur table2 pour obtenir le Flag:

SELECT 
    t1.MonthEndDate, 
    c.CustomerId, 
    Flag = ISNULL(t2.Flag, 0) 
FROM @table1 t1 
CROSS JOIN (SELECT DISTINCT CustomerId FROM @table2) c 
LEFT JOIN @table2 t2 
    ON t1.MonthEndDate = t2.MonthEndDate 
    AND c.CustomerId = t2.CustomerId 
+1

Pour une raison quelconque, je ne pensais pas utiliser à la fois Cross et gauche. Apprenez de nouvelles choses tous les jours. – jmich738

0

Je pense que vous voulez juste un left join:

select t1.*, coalesce(t2.flag, 0) as flag 
from @table1 t1 left join 
    @table2 t2 
    on t1.MonthEndDate = t2.MonthEndDate; 
+0

Malheureusement, cela ne ramène pas la CustomerId – jmich738