2012-03-28 9 views
0

Ich versuche, einen Trend über eine SQL-Tabelle zu erarbeiten, die Einträge für Dateien enthält, die Dateisystemordner über einen festgelegten Zeitraum eingeben. Ich habe eine Tabelle, die die Datumsperioden und andere enthält alle Ordner enthält, die ich bin interessiert, wenn ich (rechts außen) verbinden die beiden, die ich eine Tabelle, wie unten erhalten.Datentrend über die Tabelle hinweg

Jan 2012, folder A 2 
Jan 2012, folder B 4 
Feb 2012, folder A 2 
Feb 2012, folder B 2 

Allerdings, wenn keine Daten für ein Datumsintervall eingegeben habe ich nur null Werte so März 2012, null, null

Gibt es eine Möglichkeit, dass ich eine Null in diese Tabelle für jeden Ordner hinzufügen kann? Das würde mir geben:

Jan 2012, folder A 2 
Jan 2012, folder B 4 
Feb 2012, folder A 2 
Feb 2012, folder B 2 
Mar 2012, folder A 0 
Mar 2012, folder B 0 

ich dann für jeden Ordner einen Trend in den kommenden Monaten arbeiten muß, so dass der Unterschied zwischen Jan und Februar für Ordner A 0 und -200% zwischen Februar und März Dies würde gib mir einen Finaltisch:

Jan 2012, folder A 2 0 (first month no data) 
Jan 2012, folder B 4 0 (first month no data) 
Feb 2012, folder A 2 200% (increase on Jan) 
Feb 2012, folder B 2 -50% (decrease on Jan) 
Mar 2012, folder A 0 -200% (decrease on Feb) 
Mar 2012, folder B 0 -200% (decrease on Feb) 

Dies wird schließlich in einem SSRS-Bericht am Ende, so dass es keine Rolle, ob der Trending in der Abfrage oder durch den Report Builder geschieht.

Jede Hilfe mit diesem würde sehr geschätzt werden.

Meine Tabellenschemata wie folgt aussehen:

Ordner Tabelle:

DECLARE @folders TABLE (folderId int, folderPath varchar(500)) 

Dateien Tabelle:

DECLARE @filessAdded TABLE 
(fileId int, 
    parentId int, 
    folderPath varchar(500), 
    eventDate DATETIME, 
    folderId int); 

Datum Tabelle - dynamisch basierend auf Datumsintervalle in bestimmten Zeitraum zB Monaten bevölkert:

DECLARE @dates TABLE (DateOf VARCHAR(500)); 

Meine letzte Abfrage sieht wie folgt aus:

select isnull(Total,0), 
     folder, 
     dates.DateOf, 
     trend 
from @filesAdded as files 
right join @dates as dates on files.DateOf = dates.DateOf 
+0

Was ist das? Abfrage, die Sie gerade verwenden? Wie sieht Ihr Datenschema aus (z. B. Tabellen- und Feldnamen)? – mellamokb

+0

@Kievia: Sollte die Spalte% nicht gelesen werden: 0, 0, 0, -50%, -100%, -100%? –

+0

Yeah - Fall des Schreibens zu spät – Kievia

Antwort

0

Ich schlage vor, die Änderung der Abfrage zu sein:

with cte as 
(select d.DateOf, 
     f.folderPath, 
     count(case when datediff(month,f.DateOf,d.DateOf) = 0 then a.fileId end) 
      fileCount, 
     dense_rank() over (partition by f.folderPath order by d.DateOf) dr 
from @dates d 
cross join @folders f 
left join @filessAdded a on f.folderId = a.folderId 
group by d.DateOf, f.folderPath) 
select c1.*, 
     case when coalesce(c0.fileCount, 0) = 0 then 0 
      else (c1.fileCount - c0.fileCount)/c0.fileCount 
     end perChange 
from cte c1 
left join cte c0 on c1.folderPath = c0.folderPath and c1.dr - 1 = c0.dr 

Beachten Sie, dass Sie benötigen, um die datediff Zustand zu ändern, wenn andere Perioden von Monaten Summieren über. (Alternativ dazu könnten Sie @dates mit Spalten für das Start- und Enddatum anstelle einer einzelnen Datumsspalte füllen und dann die Abfragesituation so ändern, dass das @filessAdded Datum zwischen dem @dates Anfangs- und Enddatum liegt.)

+0

Wir gingen am Anfang und Ende Datum Spalten und neu berechnen wie die Daten, bei denen vorher ein Datum berechnet wurde, nachdem eine Datei zum Ordner hinzugefügt wurde. – Kievia

0

Sie können der zweite Ausgang mit einer äußeren Verknüpfung und verwenden isnull (Dateidatum, 0) erhalten. Ich vermute, dass Sie links verwenden, wenn Sie richtig verwenden sollten, aber Sie geben nicht genug Details.

+0

Danke für Ihre Antwort.Wenn ich einen linken Join verwende, verliere ich alle Zeilen, in denen ich keine Datei in den Ordner eingebe und bekomme: * Jan Ordner A 3 * Mar Ordner A 4 Der rechte Join behält meine Datumsspalte bei, aber verliert den Ordner: * Jan Ordner A 3 * Feb null null * Mar Ordner A 4 Idealerweise möchte ich, dass Feb den Ordner A 0 liest, aber ich weiß nicht, wie – Kievia

+0

Versuchen Sie einen vollen äußeren Join – Paparazzi

Verwandte Themen