2010-05-18 112 views
1

我有一个SQL Server数据库包含一个注册表,我需要随时间在图上绘制。 问题是,我需要根据用户从哪里注册(例如网站,wap网站或移动应用程序)将其分解。SQL Server查询

所产生的输出数据应该是这样...

[date] [num_reg_website] [num_reg_wap_site] [num_reg_mobileapp] 
1 FEB 2010,24,35,64 
2 FEB 2010,23,85,48 
3 FEB 2010,29,37,79 

等...

的源表如下...

UUID(INT),signupdate(日期时间),requestsource(VARCHAR(50))

此表中部分数据smple看起来像这样...

1001,2010-02-2:00:12:12,'website' 
1002,2010-02-2:00:10:17,'app' 
1003,2010-02-3:00:14:19,'website' 
1004,2010-02-4:00:16:18,'wap' 
1005,2010-02-4:00:18:16,'website' 

运行下面的查询返回一个数据列“总注册”为网站注册,但我不知道如何为不幸的是多列做到这一点....

select CAST(FLOOR(CAST([signupdate]AS FLOAT))AS DATETIME) as [signupdate], count(UUID) as 'total registrations' FROM [UserRegistrationRequests] WHERE requestsource = 'website' 
group by CAST(FLOOR(CAST([signupdate]AS FLOAT))AS DATETIME) 
+0

您正在使用哪个版本的SQL Server? – 2010-05-18 14:40:30

+0

第二列是什么类型的数据类型? “2010-02-2:00:12:12”看起来不是一个合适的日期时间格式。我认为它应该是像“2010-02-02 00:12:12” – StingyJack 2010-05-18 14:45:06

回答

0

听起来好像你遇到了两个问题。首先是如何将日期时间转换为仅日期值。既然你没有指定哪个版本的SQL Server,我假设它是SQL Server 2005及之前的版本。为此,我通常使用DateDiff技巧,在其中查找第零天的天数,然后将其作为DateTime进行投射。另一个技巧是创建一个类似于输出的交叉表。

Select Cast(DateDiff(d, 0, [signupdate]) As DateTime) As [Date] 
    , Sum(Case When requestsource = 'website' Then 1 Else 0 End) As num_reg_website 
    , Sum(Case When requestsource = 'wap' Then 1 Else 0 End) As num_reg_wap_site 
    , Sum(Case When requestsource = 'mobileapp' Then 1 Else 0 End) As num_reg_mobileapp 
From [UserRegistrationRequests] 
Group By Cast(DateDiff(d, 0, [signupdate]) As DateTime) 

如果您使用的是SQL Server 2008中,你可以利用它的Date数据类型,并做一些事情,如:

Select Cast([signupdate]) As Date) As [Date] 
    , Sum(Case When requestsource = 'website' Then 1 Else 0 End) As num_reg_website 
    , Sum(Case When requestsource = 'wap' Then 1 Else 0 End) As num_reg_wap_site 
    , Sum(Case When requestsource = 'mobileapp' Then 1 Else 0 End) As num_reg_mobileapp 
From [UserRegistrationRequests] 
Group By Cast([signupdate]) As Date) 
+0

现货,谢谢! – 2010-05-18 15:09:36

+0

从未见过那些DateDiff/Date技巧......好奇地看它是否比CASTFLOORCAST更快。你知道哪一个跑得更快吗? – StingyJack 2010-05-18 15:28:30

+0

@SingyJack - IIRC,即使稍微冗长一点,在浮体上的投射在技术上也会快一些。 – Thomas 2010-05-18 16:18:39

1
SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME), 
     SUM(CASE WHEN requestsource = 'website' THEN 1 ELSE 0 END), 
     SUM(CASE WHEN requestsource = 'wap' THEN 1 ELSE 0 END), 
     SUM(CASE WHEN requestsource = 'app' THEN 1 ELSE 0 END) 
FROM mytable 
GROUP BY 
     CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME) 
0

你可以GROUP BY两个值;第一,日期(尽管你可以使用CONVERT(varchar(50), signupdate, 102)或其他风格,以避免所有的地板:)),然后是注册模式。 GROUP BY可以接受多个参数!

所以,像这样:

SELECT requestsource, count(*), CONVERT(varchar(50), signupdate, 102) 
FROM userregistrationrequest 
GROUP BY CONVERT(varchar(50), signupdate, 102), requestsource 

...用你自己的风格,而不是102来适应。

请参阅here以获取合适的CONVERT样式列表。