Consulta de totales sin saltar valores intermedios

06/03/2007 - 16:09 por globatoar | Informe spam
Hola grupo, tengo el presente interrogante:
Deseo obtener el total de venta por mes para los doce meses anteriores
a una fecha, para lo cual realizo la siguiente consulta:

"Declare @Fecha VarChar(8)

Select Top 12 Mes, Sum(Monto) as Total
From

(Select year(Fecha) + '/' + Month(Fecha) as Mes, Monto

From Ventas Where Fecha <= @Fecha) As Q1



Group by Mes
Order by Mes Desc"

Esto funciona bien y resuelve mi problema, salvo que cuando no hay
datos de un mes en particular (porque no se ha vendido nada en ese
periodo), la consulta no arroja nada para ese mes y pasa al siguiente,
mientras lo que yo necesito es que coloque el mes con total cero,
manteniéndose dentro de los doce inmediatos anteriores.

Cómo es posible hacer esto?
Lo primero que se me ocurre es crear una tabla auxiliar con todos los
meses posibles para unir con la de la consulta de modo que no se
escape ninguno, pero no me parece que sea lo más eficiente.
Muchas gracias.

Preguntas similare

Leer las respuestas

#6 Carlos Sacristan
06/03/2007 - 19:54 | Informe spam
http://www.helpdna.net/bosqlfaq01.htm

"etragu" <Nando> escribió en el mensaje
news:
Buenas
tengo una bbdd en modo recuperacion sencillo, y un dts que a partir de
ayer
empezo a dar un error al importar una tabla, el error dice que esta lleno
el
registro de transacciones y que debo hacer un respaldo!!
probe cambiando el modo de recuperacion a completo y haciendo ilimitado el
tamaño del log, pero lo mismo sale el error, lo volvi a pasar a sencillo y
sigue el mismo problema
se me ocurre que se debe haber roto algun archivo de sistema o algo asi

Alguna idea?

gracias


Respuesta Responder a este mensaje
#7 globatoar
07/03/2007 - 21:22 | Informe spam
Muchas gracias Alejandro, utilicé tu ejemplo y me ha solucionado el
problema.
Un abrazo,

Guido.-


On 6 mar, 13:55, Alejandro Mesa
wrote:
Trata:

use northwind
go

declare @d1 datetime
declare @d2 datetime

set @d1 = '19980605'
set @d2 = dateadd(month, -12, @d1)

select
year(t.d) as y,
month(t.d) as m,
count(o.orderid) as cnt
from
(
select
dateadd(month, a.m, b.dt) as d
from
(
select 0 as m
union all
select 1 as m
union all
select 2 as m
union all
select 3 as m
union all
select 4 as m
union all
select 5 as m
union all
select 6 as m
union all
select 7 as m
union all
select 8 as m
union all
select 9 as m
union all
select 10 as m
union all
select 11 as m
) as a
cross join
(
select convert(varchar(6), @d2, 112) + '01' as dt
) as b
) as t(d)
left join
dbo.orders as o
on convert(char(6), o.orderdate, 112) = convert(char(6), t.d, 112)
group by
year(t.d),
month(t.d)
order by
y, m
go

AMB
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida