2017-01-17 10 views
2

Ich habe die unten Abfrage, die funktioniert, aber es scheint sehr unordentlich und ineffizient für mich.Wie man den Tag Teil eines Datums zu gruppieren Daten

Meine Tabelle hat zwei Spalten: TDate & Sales

TDate  Sales 
2016-03-25  5 
2016-03-24  8 
2016-03-28  7 
2016-04-21  2 
2016-04-14  1 

ich gruppieren möchten die Daten nach Jahr und Monat, das heißt ich über den Tag Teil des Datums nicht kümmern. Das Ergebnis (das die Abfrage unten gibt) lautet:

TDate   Sales 
201603  20 
201604  3 

Was ist der beste Weg, dies zu erreichen?

select left(convert(nvarchar, TDate, 112),6), sum(Sales) 
from mytbl 
group by left(convert(nvarchar, TDate, 112),6) 
order by left(convert(nvarchar, TDate, 112),6) 
+0

ich sehe nicht ein Problem mit Ihrer Anfrage. –

+0

scheint mir gut genug zu sein –

+1

Ich stimme für das Schließen dieser Frage als Off-Thema, weil Ihr Code funktioniert - ich würde Ihnen empfehlen, versuchen Sie es bei CodeReview.se – Bridge

Antwort

2

konvertieren die Daten zum ersten Tag (jeder statische Tag) von Monat und haben die Gruppierung

Hier ist ein Weg, EOMONTH

select dateadd(dd,1,eomonth(TDate,-1)) as Tdate,sum(sales) 
from mytbl 
Group by dateadd(dd,1,eomonth(TDate,-1)) 
Order by Tdate 

oder verwenden DATEFROMPARTS

select DATEFROMPARTS(year(TDate),month(TDate),1)) as Tdate,sum(sales) 
from mytbl 
Group by DATEFROMPARTS(year(TDate),month(TDate),1)) 
Order by Tdate 
mit

Dadurch wird sichergestellt, dass die Daten richtig geordnet sind. In Ihrem Ansatz sind die Daten als String angeordnet. Beide Ansätze arbeiten auf Sql Server 2012 und über

Für ältere Versionen

select DATEADD(mm, DATEDIFF(mm,0,TDate), 0) as Tdate,sum(sales) 
from mytbl 
Group by DATEADD(mm, DATEDIFF(mm,0,TDate), 0) 
Order by Tdate 
2

Für mich Ihre Anfrage ist in Ordnung, aber, vielleicht verwenden von DATEPART statt String-Konvertierung kann effizienter führen wie die Zeit verbracht haben.

Versuchen Sie folgendes:

select DATEPART(year, TDate) *100 + DATEPART(month, TDate), sum(Sales) 
from mytbl 
group by DATEPART(year, TDate) *100 + DATEPART(month, TDate) 
order by DATEPART(year, TDate) *100 + DATEPART(month, TDate) 
0

Wickeln Sie Ihre ursprüngliche Abfrage in einer abgeleiteten Tabelle, um etwas Eingabe zu speichern, und auch sie ANSI SQL-konform machen:

select TDate, sum(Sales) 
from 
(
    select left(convert(nvarchar, TDate, 112),6) TDate, Sales 
    from mytbl 
) dt 
group by TDate 
order by TDate 

So kann man nicht haben um den gleichen Ausdruck dreimal zu schreiben! (D. h leichter einzustellen/aufrechtzuerhalten.)

(gleicher Trick kann für die anderen Antworten auf die Frage verwendet werden.)