2017-10-10 2 views
1

J'essaie de faire correspondre une date de ma table dimdate avec les dates de ma table des ventes. La raison de l'utilisation du left join est que nous voyons toutes les dates entre 2017-10-05 à 2017-10-10 et la matrice SSRS affiche une colonne pour chaque date, même si elle ne contient aucune donnée.La jointure gauche et les dates correspondantes?

Ceci est une exemple de requête:

declare @table table 
(
    fname varchar(20), 
    Sales int, 
    SaleDate date, 
    LastSale date 
) 

insert into @table 
select 'John', 1, '2017/10/08', '2017/10/10' 
union 
select 'John', 3, '2017/10/09', '2017/10/10' 
union 
select 'John', 5, '2017/10/10', '2017/10/10' 
union 
select 'Mary', 1, '2017/10/06', '2017/10/08' 
union 
select 'Mary', 3, '2017/10/07', '2017/10/08' 
union 
select 'Mary', 5, '2017/10/08', '2017/10/08' 
union 
select 'Carl', 10, '2017/10/07', '2017/10/09' 
union 
select 'Carl', 13, '2017/10/08', '2017/10/09' 
union 
select 'Carl', 32, '2017/10/09', '2017/10/09' 


select dim.fulldatealternatekey as 'fulldate', fname, sales, t.SaleDate 
from dimdate dim left join @table t 
on dim.fulldatealternatekey = t.SaleDate 
where FullDateAlternateKey between '2017-10-05' and '2017-10-10' 
and LastSale < '2017-10-10' 

Le problème est que personne n'a '10 -05 à 2017' si fname est nulle, qui se visse le rapport, car il montre une ligne supplémentaire.

L'autre problème est que je ne veux pas voir quelqu'un dont lastsale est 10/10/2017, mais dès que je décommenter and LastSale < '2017-10-10' il devient un inner join et je ne vois pas non plus 2017-10 -05 ou 2017-10-10.

La sortie idéale devrait être:

fulldate  fname sales SaleDate 
2017-10-05 Carl NULL  NULL 
2017-10-06 Carl NULL  NULL 
2017-10-07 Carl 10  2017-10-07 
2017-10-08 Carl 13  2017-10-08 
2017-10-09 Carl 32  2017-10-09 
2017-10-10 Carl NULL  NULL 
2017-10-05 Mary NULL  NULL 
2017-10-06 Mary 1  2017-10-06 
2017-10-07 Mary 3  2017-10-07 
2017-10-08 Mary 5  2017-10-08 
2017-10-09 Mary NULL  NULL 
2017-10-10 Mary NULL  NULL 

Je ne ai besoin que 1 fname doit inclure tous les fulldate s 2017-10-05-2017-10-10, car il en est ainsi que SSRS montre toutes les dates, donc quelque chose comme ceci est aussi grande :

fulldate  fname sales SaleDate 
2017-10-05 Carl NULL NULL  -- It can be Carl or Mary, doesn't matter 
2017-10-07 Carl 10  2017-10-07 
2017-10-08 Carl 13  2017-10-08 
2017-10-09 Carl 32  2017-10-09 
2017-10-06 Mary 12  2017-10-06 
2017-10-07 Mary 32  2017-10-07 
2017-10-08 Mary 52  2017-10-08 
2017-10-10 Mary NULL NULL  -- It can be Carl or Mary, doesn't matter 

Je suppose que je peux créer une table temporaire de toutes les dates et mettre à jour cette table avec une ligne, puis utiliser en quelque sorte un syndicat et d'exclure cette ligne, mais je sais qu'il doit y avoir une autre façon.

Merci pour l'aide.

+0

S'il vous plaît fournir des données de structure et simples de votre table de DimDate –

Répondre

0

Pour votre condition de changement de problème LASTDATE de WHERE pour REJOIGNEZ critères pour votre sortie finale comme ci-dessous

select dim.fulldatealternatekey as 'fulldate', fname, sales, t.SaleDate 
from dimdate dim left join @table t 
on dim.fulldatealternatekey = t.SaleDate and LastSale < '2017-10-10' 
where FullDateAlternateKey between '2017-10-05' and '2017-10-10' 

, requête doit être

select 
    dim.fulldatealternatekey as 'fulldate', 
    coalesce(fname, (SELECT TOP 1 fname from @table)) as fname, 
    sales, 
    t.SaleDate 
from dimdate dim left join @table t 
    on dim.fulldatealternatekey = t.SaleDate and LastSale < '2017-10-10' 
where FullDateAlternateKey between '2017-10-05' and '2017-10-10' 
order by dim.fulldatealternatekey asc