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.
S'il vous plaît fournir des données de structure et simples de votre table de DimDate –