2010-03-31 7 views
5

J'ai quelques données numériques qui arrivent toutes les 5 minutes (c'est-à-dire 288 valeurs par jour et quelques jours de données). J'ai besoin d'écrire une requête qui peut retourner la somme de toutes les valeurs pour chaque jour. Donc, actuellement la table ressemble à ceci:Agréger les valeurs des colonnes SQL par période de temps

03/30/2010 00:01:00 -- 553 
03/30/2010 00:06:00 -- 558 
03/30/2010 00:11:00 -- 565 
03/30/2010 00:16:00 -- 565 
03/30/2010 00:21:00 -- 558 
03/30/2010 00:26:00 -- 566 
03/30/2010 00:31:00 -- 553 
... 

Et cela se poursuit pendant plusieurs jours « x », je voudrais la requête pour renvoyer le numéro « x » de lignes, chacune contenant la somme de tous les valeurs sur chaque jour. Quelque chose comme ceci:

03/30/2010 -- <sum> 
03/31/2010 -- <sum> 
04/01/2010 -- <sum> 

La requête sera dans un webpart Dundas, donc, malheureusement, je ne peux pas écrire des fonctions utilisateur personnalisées pour l'aider. Toute la logique doit être dans la seule grande requête. Toute aide serait appréciée Merci. J'essaie de le faire fonctionner en utilisant GROUP BY et DATEPART pour le moment, je ne sais pas si c'est la bonne façon d'y arriver.

Répondre

1

Je ne vois pas comment vous pourriez utiliser DATEPART pour cela car il ne peut pas renvoyer uniquement la partie date d'une valeur DATETIME (corrigez-moi si je me trompe). Qu'est-ce que le travail est d'utiliser DATEADD pour "nul" l'heure et le groupe par une valeur de la forme YYYY-MM-DD 00:00:00.000.

La requête suivante fonctionne avec la base de données Adventure Works au cas où vous l'auriez (testée sur SQL Server 2005). Autre que l'utilisation DATEADD il est très similaire à la suggestion @OMG Ponies:

select 
    dateadd(dd, 0, datediff(dd, 0, OrderDate)) as SaleDay 
    , sum(taxamt) as Amount 
from 
    Sales.SalesOrderHeader 
group by 
    dateadd(dd, 0, datediff(dd, 0, OrderDate)) 
order by 
    SaleDay 

L'idée de dateadd(dd, 0, datediff(dd, 0, OrderDate)) est d'abord obtenir le « nombre de jours écoulés depuis le début du temps jusqu'à ce que votre date » (le datediff -partie) puis ajoutez ce nombre de jours au début de l'heure. Ce qui vous donne le "début de votre journée". J'espère que cela est compréhensible :)

2

Voici une bonne astuce. Si vous lancez un SQL DATETIME à un FLOAT il vous donne la date days.fractionofday

Par conséquent, si vous étage que, et revenez en arrière à un DATETIME il vous donne minight à la date indiquée.

CAST(FLOOR(CAST(MyDateTime AS FLOAT)) AS DATETIME) 

Par conséquent, ma façon préférée de le faire est.

select 
    CAST(FLOOR(CAST(OrderDate AS FLOAT)) AS DATETIME) 
    , sum(taxamt) as Amount 
from 
    Sales.SalesOrderHeader 
group by 
     CAST(FLOOR(CAST(OrderDate AS FLOAT)) AS DATETIME) 

Je n'ai aucune idée si cela est plus/moins efficace que toutes les bonnes réponses précédentes.

+0

Vos crochets a été dans le mauvais ordre CAST (FLOOR (CAST ([OrderDate] AS FLOTTANT)) AS DATETIME) – Imrul

+0

Merci, fixe (je l'espère) – Jamiec

2

U peut utiliser CAST à Date Type

SELECT [ENTRY_DATE],CAST([ENTRY_DATE] AS date) AS 'date' 
FROM [PROFIT_LIST] 

groupe Maintenant, vous pouvez en fonction de cela.

SELECT CAST([ENTRY_DATE] AS date) AS 'date',SUM(PROFIT) 
FROM [PROFIT_LIST] 
GROUP BY CAST([ENTRY_DATE] AS date) AS 'date' 
+0

+1; bonne solution, mais cela ne fonctionne que dans SQL 2008 (pas dans SQL 2005 car il n'y a pas de type "DATE" ici). – scherand

Questions connexes