Die Abfrage, die ich entwickeln muss, ist, Websites aufzulisten, die keine Datensätze (Retail-Transaktionen) für ein bestimmtes Datum haben. Ich konnte dies für eine bestimmte Site erreichen, aber ich weiß, dass die Abfrage effizienter mit Joins geschrieben werden kann, aber mein Ausflug in Innere und Äußere hat nicht viel Spaß gemacht.Optimieren Sie T-SQL-Abfrage
Hier ist, was ich bisher habe:
DECLARE @StartDate DATE = '2017-11-01',
@EndDate DATE = '2017-11-30';
SELECT tx.Txndate, count(*) as txCount
FROM [Report].[dbo].[FactTransactions] tx
where tx.Site = 2
and tx.TxnDate between @StartDate and @EndDate
group by tx.TxnDate
union all
select db.daybookdate, 0 as txCount
from DimDaybook db
where db.daybookdate between @StartDate and @EndDate
and NOT EXISTS (SELECT 1 FROM [Report].[dbo].[FactTransactions] AS t WHERE t.TxnDate = db.daybookdate and t.txndate between @StartDate and @EndDate and t.site = 2)
order by tx.Txndate
Das gibt mir die Ergebnismenge für Website 2
Txndate txCount
2017-11-01 1691
2017-11-02 1657
2017-11-03 1835
2017-11-04 1587
2017-11-05 1489
2017-11-06 1544
2017-11-07 1525
2017-11-08 1782
2017-11-09 1848
2017-11-10 1990
2017-11-11 0
2017-11-12 0
Was ich wirklich eine Ergebnismenge haben möchten, die wie folgt aussieht und läuft viel viel schneller als mein Hack (derzeit etwa 2 Minuten - für den Kontext der Transaktion Tabelle hat 83.486.412 Datensätze)
Site Date Transactions
2 11/11/17 0
2 12/11/27 0
3 12/11/17 0
22 1/11/17 0
Was ist die gewünschte Logik hinter der zweiten Ergebnismenge? Möchten Sie nur Resultsets mit 0 Transaktionen pro Tag pro Site? –
Persönlicher Vorschlag außerhalb des Bereichs der Frage, ich würde die 'between'-Bedingung ändern, um explizit zu zeigen, was Sie suchen, da das Verhalten von' between' nicht über alle db-Engines konsistent ist. Manchmal ist es inklusive, manchmal nicht. – user2366842