SQL - Filas repetidas

 
Vista:

Filas repetidas

Publicado por Damian (26 intervenciones) el 01/10/2008 22:45:23
Tengo una consulta con union el problema es que me trae las categorias repetidas y por mas que ponga distinct en cada select no tiene sentido ya que las categorias dan totales distintos, segun se traiga de pedidos o de facturacion y la idea es que si por ejemplo Ferreteria esta en las dos tablas(Pedidos y Facturacion) que me sume esos totales y no que me ponga 2 veces Ferreteria, la consulta la tengo asi:

Select C.Descripcion,round(sum(D.Total),2)[Total] from Categoria C,Articulos A,DetalleArticulo DA,Detalles D where C.CodCat=A.CodCat and A.CodArt=DA.CodArt and DA.CodDetArt=D.CodDetArt and D.IdFact in(select F.IdFact from Facturacion F where F.FechaHora Between convert(datetime,'16/09/2008',103) and convert(datetime,'30/09/2008',103)) group by C.Descripcion
union
Select C.Descripcion,round(sum(D.Total),2)[Total] from Categoria C,Articulos A,DetalleArticulo DA,Detalles D where C.CodCat=A.CodCat and A.CodArt=DA.CodArt and DA.CodDetArt=D.CodDetArt and D.IdPedido in(select P.IdPedido from Pedidos P where P.FechaEntrega Between convert(datetime,'16/09/2008',103) and convert(datetime,'30/09/2008',103)and P.Facturado='NO') group by C.Descripcion order by 2 desc

y me devuelve:

Descripcion Total

Aberturas 357.6
Pintureria 90
PVC 73
Ferreteria 71.76
Aberturas 60.7
Ferreteria 13.3
PVC 13
Electricidad 9.3
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Filas repetidas

Publicado por Jorge Morales (25 intervenciones) el 02/10/2008 18:51:09
Saludos Damián, se me ocurre que tendrías que agrupar nuevamente el resultado de tu UNION algo así:

Select Descripcion, sum(Total)
from (...TU CONSULTA CON UNION...)
Group by Descripcion

pero no creo que la forma en que lo estas haciendo sea la correcta ya que, si los totales de alguna de tus descripciones fueran identicos en la primera y segunda consulta, te juntaria las filas sin sumar el total, por ejemplo:

------------------------------
Primer consulta

Descripcion__Total
Aberturas____357.6
Pintureria____90
PVC________73
Ferreteria____71.76

Segunda consulta

Descripcion__Total
Aberturas____60.7 <---Diferente total al de la primer consulta
Ferreteria____71.76 <---Mismo Total que en la primer consulta
PVC________13
Electricidad__9.3
--------------------------------
Resultado con UNION

Descripcion__Total
Aberturas____357.6
Pintureria____90
PVC________73
Ferreteria____71.76 <-----Registros "UNIDOS"
Aberturas____60.7 <-----No se unió por ser diferente total
PVC________13
Electricidad__9.3
--------------------------------
Resultado de consulta anterior con SUM

Descripcion__Total
Aberturas____418.3 <-----Totales sumados
Pintureria____90
PVC________86
Ferreteria____71.76 <-----Mismo total que en UNION
Electricidad__9.3

Una solucion podría ser que agregues un "IDENTIFICADOR" para cada consulta y con esto no sucederá el problema que te comenté, me explico:

SELECT DESCRIPCION, SUM(TOTAL)
FROM(
Select 'FACTURACION' AS IDENTIFICADOR, C.Descripcion,round(sum(D.Total),2)[Total] from Categoria C,Articulos A,DetalleArticulo DA,Detalles D where C.CodCat=A.CodCat and A.CodArt=DA.CodArt and DA.CodDetArt=D.CodDetArt and D.IdFact in(select F.IdFact from Facturacion F where F.FechaHora Between convert(datetime,'16/09/2008',103) and convert(datetime,'30/09/2008',103)) group by C.Descripcion
union
Select 'PEDIDOS' AS IDENTIFICADOR, C.Descripcion,round(sum(D.Total),2)[Total] from Categoria C,Articulos A,DetalleArticulo DA,Detalles D where C.CodCat=A.CodCat and A.CodArt=DA.CodArt and DA.CodDetArt=D.CodDetArt and D.IdPedido in(select P.IdPedido from Pedidos P where P.FechaEntrega Between convert(datetime,'16/09/2008',103) and convert(datetime,'30/09/2008',103)and P.Facturado='NO') group by C.Descripcion)
GROUP BY DESCRIPCION
ORDER BY DESCRIPCION

u otra solucion podría ser que integres en una sola consulta tus condiciones (where) y elimines tu UNION, algo así:

Select C.Descripcion,round(sum(D.Total),2)[Total]
from Categoria C,Articulos A,DetalleArticulo DA,Detalles D
where C.CodCat=A.CodCat
and A.CodArt=DA.CodArt
and DA.CodDetArt=D.CodDetArt
and ( D.IdPedido
in(select P.IdPedido
from Pedidos P
where P.FechaEntrega Between convert(datetime,'16/09/2008',103) and convert(datetime,'30/09/2008',103)
and P.Facturado='NO'
or
D.IdFact
in(select F.IdFact
from Facturacion F
where F.FechaHora Between convert(datetime,'16/09/2008',103) and convert(datetime,'30/09/2008',103))
group by C.Descripcion

Espero que de algo te sirva.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Filas repetidas

Publicado por Damian (26 intervenciones) el 02/10/2008 19:15:15
Mil gracias Jorge me fije con la ultima consulta que me distes y realmente de maravillas, yo ya lo habia realizado asi sin la union pero como no me traia bien las filas hice lo de union. Se ve que me falto ese or entre medio y separar bien entre parentesis. Yo ya estaba haciendo un for con un while desde visual recorriendo cada registros y si eran de la misma categoria sumarlos con esto me ahorre este codigo. Gracias por molestarte en ayudar, ya que vengo hace unos dias con esta consulta.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar