2016-03-31 3 views
0

Ich habe eine SQL-Abfrage, die ich verwende, um die Anzahl der Arbeitsaufträge zu zeigen, die am Tag innerhalb eines bestimmten Datumsbereichs erstellt wurden. Es funktioniert gut, wenn ich einen einzelnen Zeitraum abfrage, z. B. 3/1/2016 bis 31.03.2016.SQL Query zeigt dieselben Daten an, basiert aber auf unterschiedlichen Daten in derselben Ansicht

SELECT DATEADD(dd, DATEDIFF(dd, 0, dateCreated), 0) the_date, 
COUNT(*) work_order_count 
FROM WorkOrder 
where active = 1 and 
dateCreated >= '3/1/2016' and 
dateCreated <= '3/31/2016 23:59:59' 
GROUP BY DATEADD(dd, DATEDIFF(dd, 0, dateCreated), 0) 
order by 1; 

Ich möchte diese gleiche Abfrage weiter einen Schritt zu tun, so dass ich die gleichen Daten abfragen können, sondern zeigen die Ergebnisse für mehrere Datumsbereiche. Mein besonderer Zweck ist es, Daten für den Vorjahresvergleich nebeneinander darzustellen. Idealerweise möchte ich die Anzahl der Arbeitsaufträge anzeigen, die in den Jahren 2014, 2015 und 2016 für 3/1-3/31 erstellt wurden, aber alle innerhalb derselben Ansicht/demselben Ergebnis.

Ist das möglich? Ich habe mir Joins angeschaut, aber sie scheinen zu sein, wenn Sie verschiedene Tabellen verwenden, nicht die gleiche.

+0

eine gespeicherte Prozedur erstellen Das akzeptiert Ihre Start-/Enddaten als Parameter. Je nachdem, wie kreativ Sie mit dieser Prozedur arbeiten möchten, sollten Sie einfach 3 Datensätze zurückgeben können, indem Sie eine einfache Datumsmathematik mit der Funktion 'dateadd()' von sql durchführen. – fnostro

+0

Self-Joins können mit Unterabfragen in derselben Tabelle durchgeführt werden, z. B .: 'INNER JOIN (Wählen Sie aus WorkOrder ) als WorkOrderAlias1 auf WorkOrderAlias1.somejoinfield = WorkOrder.somejoinfield' – fnostro

Antwort

1

Verwenden Sie einfach bedingte Aggregation (oder eine Pivot):

SELECT CAST(dateCreated as DATE) as the_date, 
     SUM(CASE WHEN YEAR(dateCreated) = 2014 THEN 1 ELSE 0 END) as cnt_2014, 
     SUM(CASE WHEN YEAR(dateCreated) = 2015 THEN 1 ELSE 0 END) as cnt_2015, 
     SUM(CASE WHEN YEAR(dateCreated) = 2016 THEN 1 ELSE 0 END) as cnt_2016 
FROM WorkOrder 
WHERE active = 1 and 
     MONTH(dateCreated) = 3 and 
     YEAR(dateCreated) in (2014, 2015, 2016) 
GROUP BY CAST(dateCreated as DATE) 
ORDER BY the_date; 
0

Verwenden Pivot-Tabelle:

;with cte1 as (
    select dateCreated, datepart(year, dateCreated) as Y 
    from WorkOrder 
    where datepart(month, dateCreated) = 3 and datepart(day, dateCreated) between 5 and 25 
) 
SELECT * 
FROM cte1 
    PIVOT 
    (
    count(dateCreated) 
    FOR Y in ([2014], [2015], [2016]) 
) as pv 
0

Wie wäre es so etwas wie:

SELECT 
    SUM(
     CASE 
      WHEN dateCreated BETWEEN '3/1/2014' AND '3/31/2014 23:59:59' 
      THEN 1 
      ELSE 0 
     END) AS March2014, 
    SUM(
     CASE 
      WHEN dateCreated BETWEEN '3/1/2015' AND '3/31/2015 23:59:59' 
      THEN 1 
      ELSE 0 
     END) AS March2015, 
    SUM(
     CASE 
      WHEN dateCreated BETWEEN '3/1/2016' AND '3/31/2016 23:59:59' 
      THEN 1 
      ELSE 0 
     END) AS March2016 
FROM WorkOrder 
WHERE active = 1; 
0
SELECT datepart(dd, 'yyyy'), datepart(dd, 'MM'), datepart(dd, 'dd'), 
     COUNT(*) work_order_count 
FROM WorkOrder 
where active = 1 
    and dateCreated >= '3/1/2016' 
    and dateCreated < '4/1/2020' 
GROUP BY datepart(dd, 'yyyy'), datepart(dd, 'MM'), datepart(dd, 'dd')  
order by datepart(dd, 'yyyy'), datepart(dd, 'MM'), datepart(dd, 'dd');