2016-05-25 11 views
0

Ich habe eine SQL-Abfrage (unten), die nicht funktioniert, wenn das heutige Datum nicht in der Tabelle vorhanden ist. Wie erzwinge ich eine leere Zeile ohne Werte außer dem heutigen Datum im Datumsfeld? Dies ist ein Rückblick von Jahr zu Jahr, aber der Schlüssel ist das heutige Datum.Abfrage muss Zeile zurückgeben, wenn keine Zeile vorhanden ist

select p.* 
from [Apprise].[dbo].[adadjusttotal] c 
--- Match 
join (select distinct a.adjustdate as curr_dte, max(b.adjustdate) over (partition by a.adjustdate) as prev_dte 
from [Apprise].[dbo].[adadjusttotal] a 
join [Apprise].[dbo].[adadjusttotal] b on year(a.adjustdate) -1 >= year(b.adjustdate) 
and month(a.adjustdate) >= month(b.adjustdate) 
and day(a.adjustdate) >= day(b.adjustdate) 
where a.adjustdate > getdate() -5) x 
on c.adjustdate = x.curr_dte 
--- Prev Year 
join [Apprise].[dbo].[adadjusttotal] p 
on p.adjustdate = x.prev_dte    
where cast(c.adjustdate as date) = cast(getdate() as date) 
and p.adjusttype = 'QuarterByDate' 
+0

Mögliches Duplikat von [Ist es möglich, eine leere Zeile von Sql Server zurückzugeben?] (Http://stackoverflow.com/questions/5297348/is-it-possible-to-return-empty-row-from-sql- Server) – sstan

+0

Ich kann es nicht auf die gleiche Weise anwenden. – Pam

+0

Ist das wirklich korrekt in Ihrem sql: 'Tag (a.adjustdate)> = Tag (b.adjustdate)'? - Ich sehe nicht wirklich, in welcher Art von Logik der Tag des Monats größer sein muss als ein anderer Tag im Monat, unabhängig davon, um welchen Monat es sich handelt. –

Antwort

0

Fügen Sie diese nach der Abfrage:

if @@rowcount=0 
    select cast(getdate() as datetime),Null as col1,null as col2 

oder

if @@rowcount=0 

    select convert(varchar(12), getdate(),101) as curdate, null as col1,null as col2 
+0

Dies fügt eine zusätzliche Ergebnismenge mit dieser Zeile hinzu, aber es gibt auch die ursprüngliche leere Ergebnismenge zurück –

+0

Obwohl es mir eine leere Zeile für das aktuelle Jahr gibt, zieht keine dieser Antworten die Daten des Vorjahres, wie im SQL-Skript eingerichtet. – Pam

+1

Ich würde die Abfrage ausführen und die Ergebnisse in eine temporäre Tabellenreihenfolge nach der Datumsspalte einfügen. Ich würde dann eine Auswahl Top 1 @ curdate = Datum Spalte Reihenfolge nach Datum Spalte desc. Ich würde sie vergleichen, wenn das @ curdate = todays Datum und wenn nicht, würde ich eine Vereinigung mit der leeren Reihe tun, die ich zeigte, wie man plus die Reihen von der Tempentabelle verursacht. –

0

Man könnte so etwas tun:

select p.* 
from 
(select 1 as dummy) x 
outer apply (
    select p.* 
    from [Apprise].[dbo].[adadjusttotal] c 
    --- Match 
    join (select distinct a.adjustdate as curr_dte, max(b.adjustdate) over (partition by a.adjustdate) as prev_dte 
    from [Apprise].[dbo].[adadjusttotal] a 
    join [Apprise].[dbo].[adadjusttotal] b on year(a.adjustdate) -1 >= year(b.adjustdate) 
    and month(a.adjustdate) >= month(b.adjustdate) 
    and day(a.adjustdate) >= day(b.adjustdate) 
    where a.adjustdate > getdate() -5) x 
    on c.adjustdate = x.curr_dte 
    --- Prev Year 
    join [Apprise].[dbo].[adadjusttotal] p 
    on p.adjustdate = x.prev_dte    
    where cast(c.adjustdate as date) = cast(getdate() as date) 
    and p.adjusttype = 'QuarterByDate' 
) p 

Da diese äußeren Ihre Daten schließt sich immer mit Die 1 Zeile sollte auch komplett zurückkommen eine leere Zeile, wenn Daten nicht existieren.

Natürlich für alle Standardwerte, die Sie hinzufügen müssen, müssen Sie das in der SELECT-Klausel tun. select p.* gibt es nur, um es kürzer zu machen, und ich weiß nicht, was Ihre Spalten sind.

+0

Der Benutzer änderte (oder erklärte ihre Anforderungen). Der Benutzer möchte Ergebnisse plus eine leere Zeile mit dem heutigen Datum, wenn eine Zeile mit dem heutigen Datum nicht existiert. –

+0

Gibt mir noch keine Daten aus dem letzten Jahr zurück. – Pam

Verwandte Themen