Blog Calendar

July 2010
Sun Mon Tue Wed Thu Fri Sat
27 28 29 30 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
1 2 3 4 5 6 7

Visitors Statistics

4
75
11327

Common Table Expressions

Ya pasaron unos cuantos años desde mis primeros roses con SQL y actualmente creo que puedo manejar con soltura algunas cosillas monas dentro del mismo.
Recuerdo cuando me pedían algo en el trabajo y yo me la pasaba super entretenido leyendo sobre SQL porque no encontraba la manera de resolver mis problemas, ahora que lo veo creo que tan simple y que solo requería leer un poco las especificaciones del lenguaje, practicar un poco y listo!
Ahora que me puse a hacer más consultas encontré algunas cosas monas y las quiero compartir, aunque sea de una por una. Hoy hablaré en este breve post de Common Table Expression:
Que tal si tenemos una consulta medio entretenida y queremos unirla con otra que es algo simple pero que si las metemos en una sola consulta ... saz! ... cuando queremos retomar la lógica nos cuesta trabajo, ejemplo.
Tenemos reclamos que ver por mes para sacar estadísticas de nuestro servicio.
SELECT Month(FechaAltaReclamo) AS Month
            ,ReclamoId
            ,SUM(Monto) AS Monto
      FROM HistorialReclamo
      GROUP BY
             FechaAltaReclamo
             ,ReclamoId
 
Y lo queremos unir con algo que nos permita ver los montos que se han pagado en una sola exhibición
SELECT Month(FechaPago) AS Month
            ,ReclamoId
            ,SUM(Monto) AS Monto
      FROM HistorialPagos
      WHERE Estatus = 3 -- 3 es igual a cubierto
      GROUP BY
             FechaPago
             ,ReclamoId
 
Ahora queremos hacer una comparativa de ambos pero nos gustaría verlo en un solo paso, tal vez una vista.
WITH
Reclamos(FechaReclamo, ReclamoId, Monto) AS (
    SELECT Month(FechaAltaReclamo) AS Month
            ,ReclamoId
            ,SUM(Monto) AS Monto
      FROM HistorialReclamo
      GROUP BY
             FechaAltaReclamo
            ,ReclamoId
)
SELECT H.UserName, R.FechaReclamo, R.ReclamoId, R.Monto AS MontoReclamo
FROM Reclamos AS R
        INNER JOIN HistorialPagos AS H ON R.ReclamoId = H.ReclamoId
WHERE R.Monto = H.Monto
 
Con esto podemos obtener una consulta clara y sin broncas, en Oracle me parece que acepta la consulta anidada, pero en SLQ 2005 es una sola tabla en with, después investigaré algo más y lo posteo.
Code It!
Trackback URI: http://es.iver.com.mx/index.php?trackback/149

Leave a Comment

Write the captcha code you are seeing.

Comment XML feeds: RSS | Atom