我有一张桌子
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},然后有数据
我想知道当前一周有多少次约会,2。当月。 3.当前年份,每个结果都有自己的行。
非常感谢任何正确方向的帮助。实际问题比这要大得多,但我相信我现在把它简化为问题的关键。
答案 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',当我打字时,我没想到。