2016-08-09 76 views
0

mein Problem suchen, ist wie folgt:SQL Server SUM DATEDIFF und NULL, wenn sie bei Aufzeichnungen zwischen zwei Terminen

ich eine Tabelle haben (so genannte Tabelle) mit Spalten: ID, Ereignis, startdate, endDate

startdate geht vom 01.01.1900 bis heute, Enddatum auch. event ist eine beliebige Zeichenfolge und jede ID beginnt und beendet mehrere Ereignisse im Laufe der Zeit (aber nur ein Ereignis zu einem Zeitpunkt_.

Betrachten wir einen Fall, wenn wir Datensätze für Daten zwischen 1989-01-01 und 2000 erhalten möchten Wir wollen die Differenzen zwischen den Daten summieren, um die Gesamtzahl der Wochen zu ermitteln, die jede ID bei irgendei- nem Ereignis verbringt.

Das Problem, das ich habe, ist, dass dort Leute in den Daten sind, die immer noch bei irgendeinem Ereignis sind ist an, so dass ihre enddate null sind.

ich derzeit

SELECT 
    id, 
    ISNULL(enddate, 2000-01-01 sum(datediff(weeks, startdate, enddate)) AS wksdoingstuff 
WHERE 
    event IN ('something', 'somethingelse'. 'anotherthing') 
    AND BETWEEN 1989-01-01 AND 2000-01-01 
GROUP BY 
    id 
versuchen

Was mir nach:

Ich mag Reihen von unterschiedlichen IDs und jeder wird eine entsprechende Zahl, wie viele Wochen sie bei den Veranstaltungen von Interesse waren

im Moment meinen Code (nicht ganz das, was ich schrieb dort) gibt mir mehrere Reihen für jede ID, die jede unterschiedliche Periode summiert, die sie bei irgendeinem Ereignis waren.

+2

Der Code, den Sie uns gezeigt haben, nicht einmal in der Nähe ist in der Lage zu sein, zu laufen. Versuchen Sie, ein in sich geschlossenes Beispiel für ** runnable ** -Code zu erstellen (ich würde vorschlagen, eine Tabellenvariable mit ein paar Datenzeilen zu füllen, tatsächlich mit einer FROM-Klausel abzufragen, zu beheben, was auch immer gemangelt wurde) die 'ISNULL'-Zeile, usw.) –

+0

Außerdem müssen Sie uns eine klare Definition geben für welche Ausgabe Sie suchen. "DATEDIFF" zählt * Übergänge *, und wenn wir annehmen, dass Sie "Woche" statt "Wochen" bedeuteten, sollten Sie sich bewusst sein, dass es 1 für zwei Daten, die nur einen Tag auseinander liegen, zurückgibt, wenn der erste Samstag und der zweite ist ist Sonntag. Ist das das Verhalten, das du willst? Müssen * teilweise * Wochen hier berücksichtigt werden? –

+0

ja, partielles verhalten ist gut für die analyse, zusätzlich kann ich immer den tag machen um zu sehen ob die daten sinnvoll sind. Ich bin mir bewusst, dass mein Code nicht läuft, ich bin nicht am Computer, um auf den Server zuzugreifen, und wenn ich bin, habe ich keinen Zugang zum Internet, also muss ich Notizen über die Antwort schreiben und anwenden es. –

Antwort

0

Sie benötigen, wo Enddatum nicht NULL in Ihrer WHERE-Klausel ist, dann entfernen Sie die Isnull um es in den zurückgegebenen Spalten. Sie müssen eine Summe um den datediff psrt machen. Entschuldigung, ich bin auf meinem Handy, kann also nicht den Code eingeben. Wenn ich mich erinnere, schwinge ich später zurück, wenn ich eine Tastatur habe!

Auch stimme ich zu, dass Sie dd (Tage) in Ihrem datediff verwenden sollten, sonst verlieren Sie teilweise Wochen. Sie können es immer in eine Dezimalzahl werfen amd teilen Sie die Summe von 7,00

+0

include ist notnull in meiner where-Klausel? aber ich will willkürlich sagen, dass die NULLS das Datum 2000-01-01 sind, weil ich im Grunde zähle, wie viele Wochen sie bei einer Gruppierung von Ereignissen während eines Datumsfensters waren. Ich möchte nicht nur die Nicht-Null-Daten hinzufügen, die Leute, die null Enddaten haben, sind immer noch auf der Veranstaltung und ich möchte zählen, wie viele Wochen sie dort waren. –

0

du ausführen sollte ..

SELECT 
    id, 
    sum(datediff(weeks, startdate, ISNULL(enddate, '2000-01-01')) AS wksdoingstuff 
WHERE 
    event IN ('something', 'somethingelse'. 'anotherthing') 
    AND BETWEEN 1989-01-01 AND 2000-01-01 
GROUP BY 
    id 
+0

Vielen Dank –

+0

Das hat perfekt funktioniert –