Entonces, tengo esta declaración que devuelve OrderDates de todos los pedidos realizados por un cliente. Estoy tratando de almacenar las fechas del pedido en una variable o variable múltiple para calcular el promedio.

Sé que para un resultado específico podemos hacer algo como esto

DECLARE @tempvar DATE
SET @tempvar = (SELECT OrderDate From Orders WHERE CustID = '1234')

Pero el problema es, ¿qué pasa si la declaración de selección devuelve un número variable de resultados (filas variables), como 0 resultados o 2 resultados o 4?

Sé que podemos obtener el número de filas devueltas por una declaración de selección mediante la variable @@ROWCOUNT.

Para expresar mi problema en palabras simples, necesito almacenar la fecha más reciente y la más antigua devuelta por la declaración de selección y dividirla por el número de filas devueltas.

1
Shrey 21 feb. 2018 a las 07:25

2 respuestas

La mejor respuesta

Si tu principal objetivo es obtener el promedio de las fechas, para eso no necesitas almacenar las fechas en una variable, puedes hacerlo directamente como sigue.

SELECT CAST(AVG(CAST(OrderDate AS FLOAT)) AS DATETIME) FROM Orders WHERE CustID = '1234'

También puede almacenar el promedio de todas las fechas dentro de una variable, puede hacerlo como sigue.

 DECLARE @AvgDate DATETIME
 SELECT @AvgDate =  CAST(AVG(CAST(OrderDate AS FLOAT)) AS DATETIME) 
 FROM Orders WHERE CustID = '1234'

Aún así, si desea almacenar las fechas en alguna variable, en ese caso, para almacenar más de 1 valor, mejor elija un tipo de datos de tabla de la siguiente manera.

DECLARE @OrderDates TABLE(OrderDate DATETIME)


INSERT INTO @OrderDates(OrderDate)
SELECT OrderDate From [Orders] WHERE CustID = '1234'

--TO GET AVG
SELECT CAST(AVG(CAST(OrderDate AS FLOAT)) AS DATETIME) FROM @OrderDates ;
-- RETURNS ALL ROW
SELECT * FROM @OrderDates 

Editar:

Para poner mi problema en otras palabras, necesito obtener el número de días entre la fecha más alta y la más pequeña devuelta por la declaración SELECT

Para encontrar los días entre la fecha MAX y la fecha mínima, puede hacer lo siguiente.

SELECT  DATEDIFF(day, MIN(OrderDate), MAX(OrderDate)) FROM @OrderDates 

O

  SELECT DATEDIFF(day, MIN(OrderDate), MAX(OrderDate))   FROM Orders WHERE CustID = '1234'
3
PSK 21 feb. 2018 a las 04:51

Creo que esto te da lo que quieres en solo una línea de código:

select dateadd(d, avg(datediff(d, '1970-01-01', OrderDate)), '19700101') from Orders where CustID = '1234'

En respuesta al comentario a continuación, intente:

select  
        dateadd(d, datediff(d, '1970-01-01', max(OrderDate)) - datediff(d, '1970-01-01', min(OrderDate)) / count(*), '1970-01-01') as requested_calc,
        dateadd(d, avg(datediff(d, '1970-01-01', OrderDate)), '19700101') as avg_date
    from Orders 
    where CustID = '1234'

Pero por mi vida, no entiendo por qué querrías este cálculo. Así que me quedé con el otro también.

Espero que esto ayude.

1
jwolf 21 feb. 2018 a las 05:02