2010-03-31 22 views
5

Tengo algunos datos numéricos que aparecen cada 5 minutos (es decir, 288 valores por día y varios días de datos). Necesito escribir una consulta que pueda devolver las sumas de todos los valores para cada día. Así actualmente la tabla se ve así:Valores agregados de la columna SQL por período de tiempo

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 
... 

Y esto continúa por 'x' número de días, me gustaría volver a la consulta número de filas 'x', cada uno de los cuales contiene la suma de todos los valores en cada día. Algo como esto:

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

La consulta se irá dentro de un elemento Web Dundas, por lo que lamentablemente no se puede escribir funciones de usuario personalizadas que le ayuden. Toda la lógica debe estar en solo una gran consulta. Cualquier ayuda será apreciada, gracias. Estoy intentando hacer que funcione usando GROUP BY y DATEPART en este momento, sin estar seguro de si es la manera correcta de hacerlo.

Respuesta

1

No veo cómo podría usar DATEPART para esto ya que no puede devolver solo la parte de la fecha de un valor DATETIME (corríjame si me equivoco). Lo que sí funciona es usar DATEADD para "anular" la hora y agrupar por un valor del formulario YYYY-MM-DD 00:00:00.000.

La siguiente consulta funciona en contra de la base de datos de Adventure Works en caso de que la tenga (probado en SQL Server 2005). Aparte del uso de DATEADD es muy similar a los potros @OMG sugerencia:

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 

La idea de dateadd(dd, 0, datediff(dd, 0, OrderDate)) es conseguir primero el "número de días transcurridos desde el principio de los tiempos hasta la fecha" (el datediff -parte) y luego agregue este número de días al "comienzo del tiempo". Lo que te da el "comienzo de tu día". Espero que esto sea comprensible :)

2

Aquí hay un buen truco. Si lanzas un SQL DATETIME a un FLOAT le da la fecha como days.fractionofday

Por lo tanto si usted baja que, a su vez, y de nuevo a un DATETIME le da minight en la fecha indicada.

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

Por lo tanto, mi forma favorita de hacerlo es.

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) 

No tengo idea si eso es más/menos eficiente que cualquier respuesta correcta anterior.

+0

sus soportes se encontraba en mal fin CAST (PISO (CAST ([FechaPedido] como float)) AS DATETIME) – Imrul

+0

Gracias, fijo (espero) – Jamiec

2

U puede utilizar REPARTO a fecha tipo

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

Ahora se pueden agrupar por acuerdo con esto.

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

1; buena solución, pero solo funciona en SQL 2008 (no en SQL 2005 ya que no hay ningún tipo de "FECHA" allí). – scherand

Cuestiones relacionadas