2016-10-05 8 views
1

Ich habe die folgende Struktur (die von einigen Joins über Tabellen usw. kam), die verwendet werden, um ein Diagramm zu erstellen.Füllen Sie Datum Lücken in SQL-Abfrage mit Nullen

Einige IDs haben keine Daten für alle Daten, die zu einigen gestrichelten Linien im Diagramm führen.

Die Frage ist, wie kann ich die fehlenden Daten für jede ID hinzufügen und ihre Datenzelle mit Nullen füllen?

enter image description here

Als Skript:

(67, '2016-09-28 00:00:00.000',1), 
(178, '2016-09-28 00:00:00.000',6), 
(42, '2016-09-25 00:00:00.000',1), 
(66, '2016-09-25 00:00:00.000',122), 
(67, '2016-09-25 00:00:00.000',2), 
(10, '2016-09-24 00:00:00.000',5), 
(13, '2016-09-24 00:00:00.000',4), 
(66, '2016-09-24 00:00:00.000',198), 
(67, '2016-09-24 00:00:00.000',15), 
(178, '2016-09-24 00:00:00.000',4), 
(10, '2016-09-23 00:00:00.000',1), 
(13, '2016-09-23 00:00:00.000',2), 
(42, '2016-09-23 00:00:00.000',4), 
(66, '2016-09-23 00:00:00.000',208), 
(67, '2016-09-23 00:00:00.000',15) 
+1

Ich denke, dass Sie eine Kalendertabelle irgendeiner Art verwenden müssen. –

+1

Mögliches Duplikat von [SQL: Daily Report für mit Benutzerzählungen] (http://stackoverflow.com/questions/39849213/sql-daily-report-for-with-user-counts) – JohnHC

+0

@JohnHC Ich konnte das nicht visualisieren Datenstruktur so kann nicht sicher sagen, ob dies ein Duplikat ist – espressionist

Antwort

1

Eine weitere Möglichkeit, mit Kalender Tisch sitzt und CROSS JOIN:

;WITH YourQueryOutput AS (
--put your select statement here 
), calendar AS (
SELECT CAST(MIN(RoundedTime) as datetime) as d, 
     MAX(RoundedTime) as e 
FROM YourQueryOutput 
UNION ALL 
SELECT DATEADD(day,1,d), 
     e 
FROM calendar 
WHERE d < e 
) 

SELECT t.ID, 
     c.d, 
     COALESCE(t1.[data],0) as [data] 
FROM calendar c 
CROSS JOIN (
    SELECT DISTINCT ID 
    FROM YourQueryOutput 
    ) t 
LEFT JOIN YourQueryOutput t1 
    ON t.ID = t1.ID and t1.RoundedTime = c.d 
ORDER BY t.ID, c.d 
OPTION(MAXRECURSION 0) 

Ausgang für Probe Sie haben

zur Verfügung gestellt
ID d      data 
10 2016-09-23 00:00:00.000 1 
10 2016-09-24 00:00:00.000 5 
10 2016-09-25 00:00:00.000 0 
10 2016-09-26 00:00:00.000 0 
10 2016-09-27 00:00:00.000 0 
10 2016-09-28 00:00:00.000 0 
... 
178 2016-09-23 00:00:00.000 0 
178 2016-09-24 00:00:00.000 4 
178 2016-09-25 00:00:00.000 0 
178 2016-09-26 00:00:00.000 0 
178 2016-09-27 00:00:00.000 0 
178 2016-09-28 00:00:00.000 6 
+0

das war genau das, was ich suchte, vielen Dank !! – espressionist

1

Hier ist eine Methode:

with t as (
     <your query here> 
    ) 
select i.id, rt.roundedtime, coalesce(data, 0) as data 
from (select distinct id from t) i cross join 
    (select distinct roundedtime rt from t) rt left join 
    t 
    on t.id = i.id and t.roundedtime = rt.roundedtime; 

Mit anderen Worten, erstellen Sie die Liste der Termine und id s cross join verwenden. Dann verwenden Sie eine left join, um Ihre Daten einzubringen.

Diese Abfrage verwendet select distinct auf Ihre ursprünglichen Daten, um die Listen der Daten und IDs zu erhalten. Es kann effizientere Wege geben, um jede dieser Listen zu erhalten.

+0

Danke für die Rückmeldung. Das Problem ist, dass nicht alle Daten aufgeführt sind, so dass sie nicht in Ihrer Abfrage angezeigt werden. – espressionist

0

Sie können überprüfen, ISNULL (YourDataColumn, 0) in SELECT-Anweisung, wo Sie Join verwendet haben.

Beispiel:

SELECT 
    Q.QuestionId, 
    Q.SenderType, 
    ISNULL(Q.Data,0) AS Data 
FROM @tblQuestion Q 
LEFT JOIN @tblTeacher T ON Q.SenderId=T.Id AND Q.SENDERTYPE='TEACHER' 
LEFT JOIN @tblInstitute I ON Q.SenderId=I.Id AND Q.SENDERTYPE='INSTITUTE' 

IN oben Select Statement Data column return 0 wenn keine Daten verfügbar, nachdem

+0

Wie ich verstehe, gibt es einige IDs, die nicht in diese Abfrage gelangen, und OP muss sie mit fehlenden Daten und Nullen anzeigen. – gofr1

+0

AS in ich verstehe in der Ausgabetabelle keine Daten in gegen einige Datum so Diagramm nicht richtig zu rendern, so sollte es einige Daten sein, wenn Diagramm int akzeptieren dann 0 sonst anderen Wert nach Datentyp –

+0

@ gofr1: Das stimmt, es gibt Lücken in beide IDs und RoundedTime in dieser Abfrage, so ein ISNULL wird hier nicht viel tun – espressionist

Verwandte Themen