2010-05-18 8 views
1

J'ai une base de données SQL Server contenant une table d'enregistrements que j'ai besoin de tracer sur un graphique au fil du temps. Le problème est que je dois décomposer cela en fonction de l'endroit où l'utilisateur s'est inscrit (par exemple, un site Web, un site WAP ou une application mobile).Requête SQL Server

les données de sortie résultantes devraient ressembler à ceci ...

[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 

etc ...

La table source est la suivante ...

UUID (int), signupdate (datetime), requestsource (varchar (50))

certaines données smple dans ce tableau ressemble à ceci ...

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' 

L'exécution de la requête suivante renvoie une colonne de données « immatriculations totales » pour les enregistrements de site Web, mais je ne sais pas comment faire pour plusieurs colonnes .... 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

Quelle version de SQL Server utilisez-vous? –

+0

Quel type de type de données correspond à cette deuxième colonne? "2010-02-2: 00: 12: 12" ne ressemble pas à un format datetime approprié. Je pense qu'il devrait être quelque chose comme "2010-02-02 00:12:12" – StingyJack

Répondre

0

Il semble que vous ayez deux problèmes. La première consiste à convertir le DateTime en une valeur Date uniquement. Puisque vous n'avez pas spécifié quelle version de SQL Server, je suppose que c'est SQL Server 2005 et avant. Pour cela, j'utilise généralement l'astuce DateDiff où je trouve le nombre de jours à partir du jour zéro, puis le transformer en date et heure. L'autre astuce consiste à créer une sortie similaire à un tableau croisé.

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) 

Si vous utilisez SQL Server 2008, vous pouvez profiter de son type de données Date et faire quelque chose comme:

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

sur place, merci! –

+0

N'a jamais vu ces trucs de DateDiff/Date ... curieux de voir si les benchmarks sont aussi rapides que ceux de CASTFLOORCAST. Connaissez-vous désinvolte qui va plus vite? – StingyJack

+0

@StingyJack - IIRC, le casting d'un float est techniquement mais légèrement plus rapide, même si un peu plus verbeux. – Thomas

0

Essayez d'utiliser PIVOT

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

Vous pouvez grouper les deux valeurs; d'abord, la date (comme vous le faites, bien que vous pourriez utiliser un CONVERT(varchar(50), signupdate, 102) ou un autre style, pour éviter tout ce revêtement de sol :)), puis le mode d'inscription. GROUP BY peut prendre plusieurs paramètres!

Donc, quelque chose comme:

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

... avec votre propre style plutôt que 102 pour répondre.

Voir here pour une liste des styles CONVERT appropriés.