多年来选择计数

时间:2013-03-20 04:55:23

标签: sql select sql-server-2008-r2 case

我有一张看起来像这样的皮卡表

create table Pickup
(
PickupID int IDENTITY,
ClientID int ,
PickupDate date ,
PickupProxy  varchar (200) ,
PickupHispanic bit default 0,
EthnCode varchar(5) ,
CategCode varchar (2) ,
AgencyID int,
Primary Key (PickupID),
);

它包含了客户的皮卡 我需要根据此表创建报告,该报告应如下所示 enter image description here


我知道我需要使用CASE,但实际上不知道如何计算年限和计算 每年的平均皮卡数。以及如何计算特定年份的皮卡。到目前为止我只有这个

SELECT
DATEPART(YEAR, PickupDate)as 'Month'

FROM dbo.Pickup 
group by DATEPART(YEAR, PickupDate)
WITH ROLLUP

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

构建这样的查询的最佳方法是使用Index表。理想情况下,在master数据库中创建它,以便服务器上的所有dbs都可以使用它,但也可以在本地db中创建。

您可以创建一个这样的

create table IndexTable
(
IndexID int NOT NULL,
Primary Key (IndexID),
);

然后用数字1 - n填充,其中n足够大,比如1,000,000。

喜欢这个

INSERT IndexTable
VALUES (1)

WHILE (SELECT MAX(IndexID) FROM IndexTable) < 1000000
INSERT IndexTable
SELECT IndexID + (SELECT MAX(IndexID) FROM IndexTable)
FROM IndexTable 

您的查询然后使用此表将月份视为整数

SELECT DATEADD(month, 0, i.IndexID) Months
      ,COUNT(p.PickupDate)
      ,AVERAGE(*Whatever*)
FROM Pickup p
     INNER JOIN
     IndexTable i ON DATEDIFF(month, p.PickupDate, 0) = i.IndexID
GROUP BY i.IndexID
WITH ROLLUP