2017-10-10 4 views
1

Ich versuche ein Datum von meiner dimdate Tabelle zu den Daten in meiner Verkaufstabelle zu finden. Der Grund für die Verwendung der left join ist so, dass wir alle Daten zwischen bis 2017-10-10 sehen und die SSRS Matrix eine Spalte für jedes Datum anzeigt, auch wenn es keine Daten hat.Linke beitreten und passende Termine?

Dies ist ein Beispiel Abfrage:

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' 

Das Problem ist, dass niemand '10 hat -05-2017' so fname null ist, die Schrauben auf den Bericht, weil es eine zusätzliche Zeile zeigt.

Das andere Problem ist, dass ich will nicht, dass jemand, das sehen lastsale ist 2017.10.10, aber sobald ich and LastSale < '2017-10-10' Kommentar- es wird eine inner join und ich sehe auch nicht 2017-10 -05 oder 2017-10-10.

Das sollte ideale Ausgangs sein:

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 

Ich brauche nur das 1 fname sollten alle fulldate s 2017-10-05-2017-10-10 enthalten, da dies so ist, dass SSRS alle Daten zeigt, so etwas wie dieses ist auch toll :

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 

gehe ich davon aus mir eine temporären Tabelle aller Termine erstellen und diese Tabelle mit einer Zeile aktualisieren, und dann irgendwie eine Vereinigung verwenden und diese Zeile ausschließen, aber ich weiß, dass es eine andere Art und Weise sein.

Danke für die Hilfe.

+0

Bitte geben Struktur und einfache Daten Ihres DimDate Tisch –

Antwort

0

Für Ihre lastdate Problem Änderungs-Bedingung von WHERE Kriterien JOIN wie unten

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' 

für die endgültige Ausgabe sollte Abfrage seiner

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 
Verwandte Themen