4 Stimmen

SQL - Anzeige der laufenden Zählung von Terminen gruppiert nach Zeitrahmen

Ich habe eine Tabelle

tblTermin { App_ID, App_Datum, Benutzer_ID }

Ich habe derzeit eine Anweisung, die die Anzahl der Termine nach Jahr und Monat gruppiert zurückgibt

    SELECT
    YEAR(App_Date) AS Year,
    MONTH(App_Date) AS Month,
    count(*) AS "No of Appointments"
    FROM
    tblapplication
    GROUP BY
    YEAR(App_Date),
    MONTH(App_Date)

Im nicht sicher, wie eine Select-Anweisung zu schreiben, um es mit Überschriften {Zeitrahmen, Anzahl der Anwendungen} zurückzugeben, und haben dann Daten in

  • Zeile 1: Zeitrahmen = bisherige Woche, Anzahl der Anwendungen = x.
  • Zeile 2: Zeitrahmen = bisheriger Monat, Anzahl der Anwendungen = y.
  • ro3 3: Zeitrahmen = bisheriges Jahr, Anzahl der Anwendungen - z.

Ich würde gerne wissen, wie viele Termine es für 1. die aktuelle Woche, 2. den aktuellen Monat gibt. 3. das aktuelle Jahr, und jedes Ergebnis in einer eigenen Zeile haben.

Für jede Hilfe in die richtige Richtung wären wir sehr dankbar. Das eigentliche Problem ist viel größer als diese, aber ich glaube, ich habe es auf den Kern der Sache für jetzt vereinfacht.

1voto

Andomar Punkte 224164

Wenn Sie mit den Ergebnissen in einer Zeile zufrieden sind, ist es relativ einfach:

select  count(case when datepart(wk, App_Date) = datepart(wk, getdate()) 
                 then 1 end) as WeekSofFar
,       count(case when datepart(m, App_Date) = datepart(m, getdate()) 
                 then 1 end) as MonthSofFar
,       count(*) as YearSoFar
from    tblApplications
where   datepart(y, App_Date) = datepart(y, getdate()) 

Wenn die getrennten Zeilen ein Muss sind, versuchen Sie etwas wie:

select  'WeekSoFar' as Period
,      (
       select  count(*)
       from    tblApplications
       where   datepart(y, App_Date) = datepart(y, getdate()) 
               and datepart(wk, App_Date) = datepart(wk, getdate()) 
       ) as NumberOfApps
union all
select  'MonthSoFar'
,      (
       select  count(*)
       from    tblApplications
       where   datepart(y, App_Date) = datepart(y, getdate()) 
               and datepart(m, App_Date) = datepart(m, getdate()) 
       )
union all
select  'YearSoFar'
,      (
       select  count(*)
       from    tblApplications
       where   datepart(y, App_Date) = datepart(y, getdate()) 
       )

0voto

ErikE Punkte 46297

Da Sie keine Angaben gemacht haben, bin ich von SQL 2008 ausgegangen.

SELECT
   X.TimePeriod,
   Count(
      CASE X.Which
      WHEN 3 THEN
         CASE
         WHEN App_Date > DateAdd(Day, -DatePart(Weekday, GetDate()), GetDate())
         THEN 1
         END
      WHEN 2 THEN CASE WHEN Month(App_Date) = Month(GetDate()) THEN 1 END
      ELSE 1 END
   ) [No of Appointments]
FROM
   tblApplication
   CROSS JOIN (
      VALUES (1, 'Year to date'), (2, 'Month to date'), (3, 'Week to date')
   ) X (Which, TimePeriod)
WHERE
   App_Date < Convert(date, GetDate() + 1)
   AND App_Date >= DateAdd(Year, DateDiff(Year, '19000101', App_Date), '19000101')
GROUP BY
   X.Which,
   X.TimePeriod
ORDER BY
   X.Which

Wenn Sie viele Daten in Ihrer Tabelle und einen Index auf App_Date haben, wird diese Abfrage wesentlich besser funktionieren als eine, die Datumsfunktionen für die gesamte Tabelle ohne Filterung verwendet.

Ich habe auch eine eingebettete Annahme, dass Ihre App_Date-Werte keinen Zeitanteil haben (sie sind alle auf 12 Uhr eingestellt). Wenn dies nicht der Fall ist, lassen Sie es mich bitte wissen, damit ich Fall 3 entsprechend ändern kann.

Wenn jemand den Code ausprobieren möchte, hier sind einige Einstellungen:

CREATE TABLE tblApplication (
   App_Date datetime
)

INSERT tblApplication
VALUES
   ('2/1/2012'), ('2/5/2012'), ('2/10/2012'), ('1/2/2012'), ('1/9/2012'),
   ('1/15/2012'), ('1/28/2012'), ('12/1/2012'), ('12/5/2012'), ('12/10/2012'),
   ('11/2/2012'), ('11/9/2012'), ('11/15/2012'), ('11/28/2012')

Tut mir leid, dass ich nicht 'JJJJMMTT' verwendet habe, ich habe nicht nachgedacht, als ich es getippt habe.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X