Distintos resultados con el group by

31/01/2006 - 16:03 por Elcritico | Informe spam
tengo esta funcion
create function ym_pos
(@posi numeric(13), @tipo char(1))
returns varchar(8)
begin

declare @vari as varchar(8)
set @vari = ''
if @tipo='S'
set @vari= cast(cast(substring(str(@posi),3,2) as
int)*100+cast(substring(str(@posi),5,2) as int) as varchar(8))
if @tipo='Y'
set @vari='20'+substring(str(@posi),3,2)
if @tipo='M'
set @vari=substring(str(@posi),5,2)
return @vari
end
y lo utilizo asi

select count(*), area,Mes,yea from (
select 'EA' as area, dbo.ym_pos(mae_posicion,'M')as Mes
,dbo.ym_pos(mae_posicion,'Y') as anno
from expomawb
where dbo.ym_pos(mae_posicion,'S') between 412 and 503 ) a
group by area,Mes,anno

select 'EA' as area, dbo.ym_pos(mae_posicion,'M')as Mes
,dbo.ym_pos(mae_posicion,'Y') as anno
into #a from expomawb
where dbo.ym_pos(mae_posicion,'S') between 412 and 503

select count(*), area, Mes, anno from #a
group by area, Mes, anno

drop table #a

En la Primera consulta el campo mes y anno me repiten el mismo valor ( el
del 1 group by, osea mes)

en la segunda opcion de consulta, uso un temporal, y sin embargo aqui si me
trae correctamente los valores

¿Porque se comporta asi el sql ?
-
Lic. Flavio A. Dellarupe
Visual Fox Developer
Bs.As.-Argentina

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
31/01/2006 - 16:36 | Informe spam
Elcritico,

Las dos sentencias no usan las mismas columnas. Fijate en la columna [yea]
de la primera consulta.

select count(*), area,Mes,yea from (
select 'EA' as area, dbo.ym_pos(mae_posicion,'M')as Mes
,dbo.ym_pos(mae_posicion,'Y') as anno
from expomawb
where dbo.ym_pos(mae_posicion,'S') between 412 and 503 ) a
group by area,Mes,anno



select 'EA' as area, dbo.ym_pos(mae_posicion,'M')as Mes
,dbo.ym_pos(mae_posicion,'Y') as anno
into #a from expomawb
where dbo.ym_pos(mae_posicion,'S') between 412 and 503

select count(*), area, Mes, anno from #a
group by area, Mes, anno




AMB

"Elcritico" wrote:

tengo esta funcion
create function ym_pos
(@posi numeric(13), @tipo char(1))
returns varchar(8)
begin

declare @vari as varchar(8)
set @vari = ''
if @tipo='S'
set @vari= cast(cast(substring(str(@posi),3,2) as
int)*100+cast(substring(str(@posi),5,2) as int) as varchar(8))
if @tipo='Y'
set @vari='20'+substring(str(@posi),3,2)
if @tipo='M'
set @vari=substring(str(@posi),5,2)
return @vari
end
y lo utilizo asi

select count(*), area,Mes,yea from (
select 'EA' as area, dbo.ym_pos(mae_posicion,'M')as Mes
,dbo.ym_pos(mae_posicion,'Y') as anno
from expomawb
where dbo.ym_pos(mae_posicion,'S') between 412 and 503 ) a
group by area,Mes,anno

select 'EA' as area, dbo.ym_pos(mae_posicion,'M')as Mes
,dbo.ym_pos(mae_posicion,'Y') as anno
into #a from expomawb
where dbo.ym_pos(mae_posicion,'S') between 412 and 503

select count(*), area, Mes, anno from #a
group by area, Mes, anno

drop table #a

En la Primera consulta el campo mes y anno me repiten el mismo valor ( el
del 1 group by, osea mes)

en la segunda opcion de consulta, uso un temporal, y sin embargo aqui si me
trae correctamente los valores

¿Porque se comporta asi el sql ?
-
Lic. Flavio A. Dellarupe
Visual Fox Developer
Bs.As.-Argentina

Respuesta Responder a este mensaje
#2 Elcritico
31/01/2006 - 16:51 | Informe spam
Disculpa, no reemplace correctamente los campos cuando transcribi el ejemplo..

Como referencia, mae_posicion tiene una estrctura de dato como esto =
2005010001 donde 05 es el año y 01 el mes..
Ahi va de nuevo
select count(*), area,Mes,anno from (
select 'EA' as area, dbo.ym_pos(mae_posicion,'M')as Mes
,dbo.ym_pos(mae_posicion,'Y') as anno
from expomawb
where dbo.ym_pos(mae_posicion,'S')between 412 and 503 ) a
group by area,Mes,anno

select 'EA' as area, dbo.ym_pos(mae_posicion,'M')as Mes
,dbo.ym_pos(mae_posicion,'Y') as anno
into #a from expomawb
where dbo.ym_pos(mae_posicion,'S')between 412 and 503

select count(*), area, Mes, anno from #a
group by area, anno , Mes

drop table #a

-
Ahora bien, si concateno las cadenas

select count(*), area,Mes+anno from (
select 'EA' as area, dbo.ym_pos(mae_posicion,'M')as Mes
,dbo.ym_pos(mae_posicion,'Y') as anno
from expomawb
where dbo.ym_pos(mae_posicion,'S')between 412 and 503 ) a
group by area,Mes+anno

los datos de MES-AÑO salen correctamente
o si al campo Anno le agrego el MAX(), pero a pesar de que no se siente el
añadido de trabajo con el MAX() no le veo el sentido meter una nueva funcion
:(

select count(*), area,Mes,max(anno) as anno from (
select 'EA' as area, dbo.ym_pos(mae_posicion,'M')as Mes
,dbo.ym_pos(mae_posicion,'Y') as anno
from expomawb
where dbo.ym_pos(mae_posicion,'S')between 412 and 503 ) a
group by area,Mes,anno

Lic. Flavio A. Dellarupe<br>
Visual Fox Developer
Bs.As.-Argentina
Respuesta Responder a este mensaje
#3 Alejandro Mesa
31/01/2006 - 19:29 | Informe spam
Elcritico,

Por que usas diferente order de columnas en la clausula "group by"?

1 -

group by area,Mes,anno



2 -

group by area, anno , Mes




AMB


"Elcritico" wrote:

Disculpa, no reemplace correctamente los campos cuando transcribi el ejemplo..

Como referencia, mae_posicion tiene una estrctura de dato como esto =
2005010001 donde 05 es el año y 01 el mes..
Ahi va de nuevo
select count(*), area,Mes,anno from (
select 'EA' as area, dbo.ym_pos(mae_posicion,'M')as Mes
,dbo.ym_pos(mae_posicion,'Y') as anno
from expomawb
where dbo.ym_pos(mae_posicion,'S')between 412 and 503 ) a
group by area,Mes,anno

select 'EA' as area, dbo.ym_pos(mae_posicion,'M')as Mes
,dbo.ym_pos(mae_posicion,'Y') as anno
into #a from expomawb
where dbo.ym_pos(mae_posicion,'S')between 412 and 503

select count(*), area, Mes, anno from #a
group by area, anno , Mes

drop table #a

-
Ahora bien, si concateno las cadenas

select count(*), area,Mes+anno from (
select 'EA' as area, dbo.ym_pos(mae_posicion,'M')as Mes
,dbo.ym_pos(mae_posicion,'Y') as anno
from expomawb
where dbo.ym_pos(mae_posicion,'S')between 412 and 503 ) a
group by area,Mes+anno

los datos de MES-AÑO salen correctamente
o si al campo Anno le agrego el MAX(), pero a pesar de que no se siente el
añadido de trabajo con el MAX() no le veo el sentido meter una nueva funcion
:(

select count(*), area,Mes,max(anno) as anno from (
select 'EA' as area, dbo.ym_pos(mae_posicion,'M')as Mes
,dbo.ym_pos(mae_posicion,'Y') as anno
from expomawb
where dbo.ym_pos(mae_posicion,'S')between 412 and 503 ) a
group by area,Mes,anno

Lic. Flavio A. Dellarupe<br>
Visual Fox Developer
Bs.As.-Argentina


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