ayuda en un query

15/12/2005 - 01:56 por Ele | Informe spam
Hola
Quiero evaluar las ventas del mes, hay un rango de dias por promocion por
cada producto y quiero obtener las ventas y los dias cuando se efectuo fuera
del rango y otra dentro del rango necesito la suma de las ventas y el total
de dias
ejemplo:
ClaArti ClaUnidad ImpRango DiasRango ImpSinRango DiasSinRango
-
10 1 344.0 30 0.0
0
159 4 6186.65 21 1305.90
9
112 6 645.0 22 5774.70
8

Create Table #tblVtas
(ClaArti int,
ClaUnidad int,
Fecha smalldatetime,
Importe float
)

Insert Into #tblVtas Values (10, 1, '20051101', 344.00)
Insert Into #tblVtas Values (112, 6, '20051113', 3065.20)
Insert Into #tblVtas Values (112, 6, '20051112', 1264.00)
Insert Into #tblVtas Values (112, 6, '20051111', 1445.50)
Insert Into #tblVtas Values (112, 6, '20051109', 0.08)
Insert Into #tblVtas Values (112, 6, '20051115', 161.23)
Insert Into #tblVtas Values (112, 6, '20051118', 161.23)
Insert Into #tblVtas Values (112, 6, '20051118', 161.23)
Insert Into #tblVtas Values (112, 6, '20051121', 161.23)
Insert Into #tblVtas Values (159, 4, '20051116', 826.00)
Insert Into #tblVtas Values (159, 4, '20051115', 790.00)
Insert Into #tblVtas Values (159, 4, '20051108', 1305.90)
Insert Into #tblVtas Values (159, 4, '20051102', 1958.85)
Insert Into #tblVtas Values (159, 4, '20051118', 2611.80)

Create Table #tblRango
(ClaArti int,
ClaUnidad int,
FechaIni smalldatetime,
FechaFin smalldatetime)

Insert Into #tblRango Values (10, 1, '20051031', '20051130')
Insert Into #tblRango Values (112, 6, '20051105', '20051110')
Insert Into #tblRango Values (112, 6, '20051115', '20051130')
Insert Into #tblRango Values (159, 4, '20051115', '20051130')
Insert Into #tblRango Values (159, 4, '20051101', '20051105')
de dias y cuantos dias son
resultado)

Declare @dtFechaIni smalldatetime, @dtFechaFin smalldatetime
Select @dtFechaIni = '20051101', @dtFechaFin = '20051130'

Select t1.ClaArti,
t1.ClaUnidad,
ImpRango=Sum(Case When t1.Fecha Between t2.FechaIni And t2.FechaFin Then
t1.Importe Else 0 End),
DiasRango=Max(DiaRango),
ImpSinRango=Sum(Case When t1.Fecha Between t2.FechaIni And t2.FechaFin Then
0 Else t1.Importe End),
DiasSinRango=Datediff(dd,@dtFechaIni,@dtFechaFin)-Max(DiaRango)+1
From #tblVtas t1
Inner Join (Select ClaArti, ClaUnidad,
FechaIni= Case When @dtFechaIni > Min(FechaIni) Then @dtFechaIni Else
Min(FechaIni) End,
FechaFin= Case When @dtFechaFin < Max(FechaFin) Then @dtFechaFin Else
Max(FechaFin) End,
DiaRango=Sum( Distinct dateDiff(dd,Case When @dtFechaIni > FechaIni Then
@dtFechaIni Else FechaIni End,
Case When @dtFechaFin < FechaFin Then @dtFechaFin Else FechaFin
End
)+1)
From #tblRango
Where FechaIni Between @dtFechaIni And @dtFechaFin
Or FechaFin Between @dtFechaIni And @dtFechaFin
Group By ClaArti, ClaUnidad
)t2
On t2.ClaArti = t1.ClaArti
And t2.ClaUnidad = t1.ClaUnidad
Group By t1.ClaArti, t1.ClaUnidad
 

Leer las respuestas

#1 Ele
16/12/2005 - 16:58 | Informe spam
Lo solucione con este query pero por si alguien tiene una mejor idea es
bienvenida

Declare @dtFechaIni smalldatetime, @dtFechaFin smalldatetime
Select @dtFechaIni = '20051101', @dtFechaFin = '20051130'

Select t1.ClaArti,
t1.ClaUnidad,
ImpRango=Sum(t1.Importe),
DiasRango= (Select Sum( Distinct DateDiff(dd,t3.FechaIni, t3.FechaFin)+1)
From #tblRango t3
Where t3.ClaArti = t1.ClaArti
And t3.ClaUnidad = t1.ClaUnidad
And (t3.FechaIni Between @dtFechaIni And @dtFechaFin
Or t3.FechaFin Between @dtFechaIni And @dtFechaFin)
),
ImpSinRango= 0,
DiasSinRango= 0
From #tblVtas t1
Where t1.Fecha Between @dtFechaIni And @dtFechaFin
And Exists (Select 1
From #tblRango t2
Where t2.ClaArti = t1.ClaArti
And t2.ClaUnidad = t1.ClaUnidad
And t1.Fecha Between t2.FechaIni And t2.FechaFin
)
Group By t1.ClaArti,t1.ClaUnidad
Union
Select t1.ClaArti,
t1.ClaUnidad,
ImpRango=0,
DiasRango=0,
ImpSinRango=Sum(t1.Importe),
DiasSinRango= (Select DateDiff(dd,@dtFechaIni,@dtFechaFin)+1-Sum( Distinct
DateDiff(dd,t3.FechaIni, t3.FechaFin)+1)
From #tblRango t3
Where t3.ClaArti = t1.ClaArti
And t3.ClaUnidad = t1.ClaUnidad
And (t3.FechaIni Between @dtFechaIni And @dtFechaFin
Or t3.FechaFin Between @dtFechaIni And @dtFechaFin)
)
From #tblVtas t1
Where t1.Fecha Between @dtFechaIni And @dtFechaFin
And NOT Exists (Select 1
From #tblRango t2
Where t2.ClaArti = t1.ClaArti
And t2.ClaUnidad = t1.ClaUnidad
And (t1.Fecha Between t2.FechaIni And t2.FechaFin)
)
Group By t1.ClaArti,t1.ClaUnidad

"Ele" escribió en el mensaje
news:
Mostrar la cita
fuera
Mostrar la cita
total
Mostrar la cita
DiasSinRango
Mostrar la cita
rango
Mostrar la cita
el
Mostrar la cita
Then
Mostrar la cita
Then
Mostrar la cita

Preguntas similares