SQL - 显示按时间范围分组的约会的运行计数

时间:2012-02-05 19:58:43

标签: sql sql-server

我有一张桌子

tblAppointment { APP_ID, App_Date, User_ID}

我目前有一份声明,表示按年份和月份分组的约会数

    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)

我不知道怎么写一个select语句来返回标题{time frame,No of applications},然后有数据

  • 第1行:时间范围=到目前为止的星期,没有app = x。
  • 第2行:时间范围=到目前为止的月份,不是app = y。
  • ro3 3:时间范围=到目前为止,没有app - z。

我想知道当前一周有多少次约会,2。当月。 3.当前年份,每个结果都有自己的行。

非常感谢任何正确方向的帮助。实际问题比这要大得多,但我相信我现在把它简化为问题的关键。

2 个答案:

答案 0 :(得分:1)

如果你对一行的结果没问题,那就相对容易了:

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()) 

如果单独的行是必须的,请尝试类似:

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()) 
       )

答案 1 :(得分:0)

我假设SQL 2008没有指定。

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

如果你的表中有很多数据,而App_Date上有索引,那么这个查询的表现要比使用整个表上的日期函数的查询要好得多,而不需要过滤。

我还有一个嵌入式假设,即您的App_Date值没有时间部分(它们都设置为12am)。如果不是这样,请告诉我,以便我可以修改案例3是正确的。

如果有人想在这里尝试代码,可以进行一些设置:

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')

很抱歉没有使用'YYYYMMDD',当我打字时,我没想到。