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

Preguntas similare

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:
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')


rango
de dias y cuantos dias son


el
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


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