2016-05-06 4 views
1

Ich versuche, aus einer Tabelle in SQL Server auszuwählen, so dass es meine FinalDate Spalte in Wochennummern gruppiert und die ThisApp Spalte für diese Woche in der nächsten Zelle summiert. Ich schaute online und ich kann nicht finden, wonach ich suche.Gruppieren Sie nach Wochennummer einschließlich leerer Wochen und Summe andere Spalte

Ich frage mich, ob das etwas ist, was ich in T-SQL tun kann?

Dies sind zur Zeit die Zeilen in meinem Tisch:

FinalDate ThisApp 
    ------------------------ 
    15/04/2016 20459.92 
    29/05/2016 7521.89 
    30/05/2016 5963.61 
    31/05/2016 3293.72 
    03/06/2016 27413.20 
    04/06/2016 8392.16 
    05/06/2016 7789.46 
    05/06/2016 11414.73 
    10/06/2016 48893.46 
    11/06/2016 14685.47 
    11/06/2016 7030.03 

Ich möchte die FinalDate Spalte mit Wochennummern ersetzen und die This App für jede Woche Zahl summieren.

auch::

Ich würde es braucht kontinuierliche Woche Zahlen angezeigt werden, so würde ich es irgendwelche Wochen überspringen nicht wollen, so zum Beispiel:

FinalDate ThisApp 
    ------------------------ 
    01/01/2016 10.00 -- (Would be week 1) 
    02/01/2016 10.00 -- (Would be week 1) 
    15/01/2016 10.00 -- (Would be week 3) 

wie anzeigen würde:

Ich verstehe dies eine sehr spezifische Anfrage, deshalb habe ich mich gefragt, ob ich es in SQL tun könnte.

+0

Ein guter Tipp wäre MM/DD/YYYY zu verwenden, wenn Termine veröffentlichen hier Verwirrung zu vermeiden. Die meisten Leute werden dieses Format annehmen, und wenn Sie DD/MM/YYYY verwenden, kann es verwirrend sein, wenn Sie nicht etwas hinzufügen, was sonst unmöglich wäre (wie '15/01/2016 '). –

Antwort

1
DECLARE @tmp table(dat datetime, 
        val float) 

insert into @tmp 
values ('15/04/2016' , 20459.92), 
     ('29/05/2016', 7521.89), 
     ('30/05/2016', 5963.61), 
     ('31/05/2016', 3293.72), 
     ('03/06/2016', 27413.20), 
     ('04/06/2016', 8392.16), 
     ('05/06/2016', 7789.46), 
     ('05/06/2016', 11414.73), 
     ('10/06/2016', 48893.46), 
     ('11/06/2016', 14685.47), 
     ('11/06/2016', 7030.03) 

SELECT Weeknumb, 
     ISNULL(sumvals,0) as weekval 
FROM 
    (SELECT DATEPART(ISOWK,DATEADD(wk,t2.number,'2016')) as Weeknumb 
    FROM master..spt_values t2 
    WHERE t2.type = 'P' 
    AND t2.number <= 255 
    AND YEAR(DATEADD(wk,t2.number,'2016'))=2016)allWeeks 
    LEFT JOIN 
    (SELECT sum(val) as sumvals, 
      datepart(ISOWK,dat) as weeks 
    FROM @tmp 
    GROUP BY datepart(ISOWK,dat)) actualData 
    ON weeks = Weeknumb 
    ORDER BY Weeknumb asc 

dort gehen Sie. Alle Wochen von 2016 mit Ihren Werten summiert

+0

Diese Abfrage funktioniert nur für ein bestimmtes Jahr (in diesem Fall 2016). –

1
SELECT DATEPART(WEEK, FinalDate) FinalDate 
,  SUM(ThisApp) ThisApp 
FROM  Your_Table 
GROUP BY DATEPART(WEEK, FinalDate) 

Um 0 zu bekommen für Wochen nicht im Datensatz Sie mit Wochennummern (1-52) und right join es eine Tabelle erstellen, müssen vorhanden. In diesem Fall würde man so etwas bekommen:

SELECT  wk.Number 
,    ISNULL(SUM(ThisApp), 0) 
FROM   Your_Table T 
RIGHT JOIN WeekNumbers wk 
      ON wk.Number = DATEPART(WEEK, T.FinalDate) 
GROUP BY  wk.Number 
+0

interessant, ich werde das versuchen, geschätzt. –

+0

Ich muss das vielleicht am Montag versuchen, da ich für ein paar Minuten ins Wochenende gehen muss. Wenn es für mich funktioniert, werde ich deine Antwort am Montag annehmen. –

+0

Viel Glück und ein schönes Wochenende – HoneyBadger

0

HoneyBadger Antwort ist gut, aber es wird Woche 1 Werte von jedem Jahr zusammen gruppieren (so wird 1. Januar 1975 mit 1. Januar 2016 gruppiert werden). Um dies zu vermeiden, müssen Sie das Jahr zur Gruppierung hinzufügen.

Auch, wie er darauf hingewiesen hat, benötigen Sie eine separate Tabelle, wenn Sie auch NULL Wochen zurückgeben möchten. Allerdings sollten Sie eine Kalendertabelle erstellen (Google diese - sie sind einfach und weit verbreitet) und Sie sollten nicht nur eine Tabelle mit Wochen 1-52 darin machen.

Um sicherzustellen, dass Sie keine Datensätze mit 0 für alle Jahr/Wochen erhalten, die Ihren Daten vorausgehen oder nachfolgen, sollten Sie Start- und Enddatumsparameter hinzufügen. Sie können sie entweder akzeptieren oder sie auf das erste und letzte FinalDate in Your_Table setzen.

Hier ist, was Sie verwenden sollten:

DECLARE @StartDate date = (SELECT MIN(FinalDate) FROM Your_Table), 
     @EndDate date = (SELECT MAX(FinalDate) FROM Your_Table) 

SELECT YEAR(C.BaseDate) AS [Year], 
     DATEPART(WEEK, C.BaseDate) AS [Week], 
     ISNULL(SUM(YT.ThisApp), 0) AS [This App Total] 
FROM  Calendar C 
LEFT OUTER JOIN Your_Table YT 
    ON C.BaseDate = CAST(YT.FinalDate AS DATE) 
WHERE C.BaseDate BETWEEN @StartDate AND @EndDate 
GROUP BY YEAR(C.BaseDate), 
     DATEPART(WEEK, C.BaseDate) 
Verwandte Themen