2017-04-10 10 views
0

Ich habe eine Tabelle, die Daten über Klasseneinträge für ein bestimmtes Journal enthält. Ich versuche, die Ergebnisse nach Wochen zu trennen, damit ich diese Einträge pro Woche zähle. Aber wenn ich am Tag gruppiere, bekomme ich auch Nullwerte. Ich möchte Datensätze mit Nullwerten weglassen. Wie mache ich das?SQL Server 2014 - So entfernen Null Datensätze

Ich schrieb den folgenden Code:

SELECT Year(JournalDate) AS YY 
     ,Month(JournalDate) AS MM 
     ,FromClass 
     ,ToClass 
     ,(SELECT Count(JournalID) 
     WHERE Day(JournalDate) >= 1 AND Day(JournalDate)=7) AS CountWeek1 
     ,(SELECT Count(JournalID) 
     WHERE Day(JournalDate) >= 8 AND Day(JournalDate)=14) AS CountWeek2 
     ,(SELECT Count(JournalID) 
     WHERE Day(JournalDate) >= 15 AND Day(JournalDate)=21) AS CountWeek3 
     ,(SELECT Count(JournalID) 
     WHERE Day(JournalDate) >= 22 AND Day(JournalDate)=28) AS CountWeek4 
     ,(SELECT Count(JournalID) 
     WHERE Day(JournalDate) >= 29 AND Day(JournalDate)=31) AS CountWeek5 


    FROM [tblJournal] 

    WHERE [JournalDate] >= '2016-09-01 00:00:00.000' 
    AND FromClass <> ToClass 
    --AND CountWeek1 IS NOT Null 

    GROUP BY Year(JournalDate), Month(JournalDate), Day(JournalDate), FromClass, ToClass 

    ORDER BY YY, MM, FromClass, ToClass 

Aber ich habe auch NULL-Werte. Ich möchte Nullwerte entfernen.

YY MM FrClass ToClass CntWk1 CntWk2 CntWk3 CntWk4 CntWk5 
2016 9 1 2 NULL NULL NULL NULL NULL 
2016 9 1 2 NULL NULL NULL NULL NULL 
2016 9 1 2 NULL NULL NULL NULL NULL 
2016 9 1 2 NULL NULL NULL NULL NULL 
2016 9 1 2 NULL 20  NULL NULL NULL 
2016 9 1 2 NULL NULL NULL NULL NULL 
2016 9 1 2 NULL NULL NULL NULL NULL 
2016 9 1 2 NULL NULL NULL NULL NULL 
2016 9 1 2 NULL NULL NULL NULL NULL 
2016 9 1 2 NULL NULL NULL NULL NULL 
2016 9 1 2 NULL NULL NULL NULL NULL 
2016 9 1 2 12  NULL NULL NULL NULL 
2016 9 1 2 NULL NULL NULL NULL NULL 
2016 9 1 2 NULL NULL NULL NULL NULL 
2016 9 1 2 NULL NULL NULL NULL NULL 
2016 9 1 2 NULL NULL NULL NULL NULL 
2016 9 1 2 NULL NULL 29  NULL NULL 
2016 9 1 2 NULL NULL NULL NULL NULL 
2016 9 1 2 NULL NULL NULL NULL NULL 
2016 9 1 2 NULL NULL NULL 25  NULL 

Wie auslassen ich die Datensätze mit NULL-Werten?

EDIT:
So würde ich wirklich wie meine Ergebnisse wie folgt aussehen:

YY MM FrmCls ToClsWk1 Wk2 Wk3 Wk4 Wk5 
2016 9 1 2 12 20 29 25 0 
2016 9 1 3 2 1 6 0 0 
2016 9 1 4 0 1 2 0 0 
2016 9 2 1 0 3 0 2 0 
2016 9 2 3 74 46 84 54 0 
2016 9 2 4 0 0 8 5 0 
2016 9 3 2 0 813 0 0 0 
+0

Nullwerte leer? – maSTAShuFu

+0

oder nicht alle Zeilen mit NULL von Cntwk1 - wk5? – maSTAShuFu

+0

Frage: Möchten Sie eine Zeile mit Werten in allen außer der letzten Spalte? Oder möchten Sie vier Zeilen (eine Zeile für jede Zeile, die mindestens eine Spalte ungleich null hat)? – pmbAustin

Antwort

1

Nehmen Sie Ihre Daten über und setzen Sie in eine temporäre Tabelle. Danach können Sie auf Ihr Ergebnis Abfrage von Daten, die von Jahr Suming, Monat usw. wie folgt aus:

SELECT YY, MM, FrClass,ToClass,SUM(cntwk1),SUM(cntwk2),SUM(cntwk3),SUM(cntwk4),SUM(cntwk5) 
FROM #data 
GROUP BY YY, MM, FrClass,ToClass 
+0

Danke, mein Herr. Wie würde ich diese Aussage in meinem Code verwenden? – user1777929

+0

@ user1777929 nach Gruppe nach Anweisung. – Stephanie

+0

Das würde nicht ganz funktionieren, weil es mir nur Datensätze geben würde, wo der 4.Week Werte hat. Alle anderen Spalten wären null. – user1777929

1

wie über dieses

select * from 
(
SELECT Year(JournalDate) AS YY 
     ,Month(JournalDate) AS MM 
     ,FromClass 
     ,ToClass 
     ,isnull((SELECT Count(JournalID) 
     WHERE Day(JournalDate) >= 1 AND Day(JournalDate)=7),0) AS CountWeek1 
     ,isnull((SELECT Count(JournalID) 
     WHERE Day(JournalDate) >= 8 AND Day(JournalDate)=14),0) AS CountWeek2 
     ,isnull((SELECT Count(JournalID) 
     WHERE Day(JournalDate) >= 15 AND Day(JournalDate)=21),0) AS CountWeek3 
     ,isnull((SELECT Count(JournalID) 
     WHERE Day(JournalDate) >= 22 AND Day(JournalDate)=28),0) AS CountWeek4 
     ,isnull((SELECT Count(JournalID) 
     WHERE Day(JournalDate) >= 29 AND Day(JournalDate)=31),0) AS CountWeek5 


    FROM [tblJournal] 

    WHERE [JournalDate] >= '2016-09-01 00:00:00.000' 
    AND FromClass <> ToClass 

    GROUP BY Year(JournalDate), Month(JournalDate), Day(JournalDate), FromClass, ToClass 
) x 
    where CountWeek1 +CountWeek2+CountWeek3+CountWeek4+CountWeek5 <> 0 

    ORDER BY YY, MM, FromClass, ToClass 
+0

Danke, mein Herr. Das hat funktioniert. Gibt es jedoch eine Möglichkeit, sie weiter zu gruppieren? Z.B; zur Zeit bekomme ich eine Nummer in 1 Spalte und die anderen Spalten sind 0. Dann eine weitere Zeile mit einer Spalte, die eine Nummer hat, die früher 0 in der vorherigen Zeile war (für die gleiche Gruppe) – user1777929