2010-05-18 4 views
1

У меня есть БД SQL Server, содержащая таблицу регистрации, которую мне нужно построить на графике с течением времени. Проблема в том, что мне нужно разбить это на том, где зарегистрирован пользователь (например, веб-сайт, wap-сайт или мобильное приложение).SQL Server query

результирующие выходные данные должны выглядеть следующим образом ...

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

Запуск следующего запроса возвращает один столбец данных «всего регистрации» для регистрации веб-сайта, но я не знаю, как сделать это для нескольких столбцов Unfortunatly ....

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 вы используете? –

+0

Каким типом данных является второй столбец? «2010-02-2: 00: 12: 12» не похоже на правильный формат даты и времени. Я думаю, что это должно быть что-то вроде «2010-02-02 00:12:12» – StingyJack

ответ

0

Похоже, что у вас есть две проблемы. Во-первых, как преобразовать DateTime в значение Date only. Поскольку вы не указали, какую версию 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

пятно на, спасибо! –

+0

Никогда не видел те тэки DateDiff/Date ... любопытно посмотреть, сравнивает ли он тесты быстрее, чем CASTFLOORCAST. Знаете ли вы, что бегут быстрее? – StingyJack

+0

@StingyJack - IIRC, литье в поплавок технически, но более мелкое быстрее, даже если немного более многословно. – Thomas

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.