jump to navigation

T-SQL Consultas con Pivot (referencias cruzadas parte 1) 20/01/2014

Posted by Gonzalo Rosas in Base de datos, IT Workers.
Tags: , ,
2 comments

Para mis alumnos del curso de BDA.
El sábado pasado me atoré con una consulta T-SQL en clase. Aquí les dejo dos soluciones. Pero me gustaría que me comentaran.

  1. ¿Cuál es el enunciado de la consulta?
  2. ¿Cuál de las dos alternativas les parece más sencilla?

Les prometo que en la semana les doy la explicación de cada una. 

Alternativa 1.
Select E.Escuela, IsNull(M.Mujeres,0) as Mujeres, IsNull(H.Hombres,0) as Hombres
From (   Select Escuela, count (curp) as Mujeres   
             From Becado   
             Where Substring (curp,11,1) = ‘M’   
             Group by Escuela  
) M  
right join  ( 
                  Select Distinct Escuela   
                  From Becado  
) E  
On M.Escuela = E.Escuela  
left join  ( 
                 Select Escuela, count (curp) as Hombres   
                 From Becado   
                 Where Substring (curp,11,1) = ‘H’   Group by Escuela  
) H  
On H.Escuela = E.Escuela  

 

Alternativa 2

Select Escuela,  M as Mujeres, H as Hombres
From (   
               Select Escuela, Substring (curp,11,1) as Genero, curp   
               From Becado     
          ) Origen
Pivot  ( 
                Count (Origen.curp) 
                For origen.Genero In (M,H)  
) as P;

 

Función en T-SQL para calcular la edad con base a la CURP 14/01/2014

Posted by Gonzalo Rosas in Base de datos, IT Workers.
Tags: , ,
4 comments

Los ejercicios de este cuatrimestre en Base de Datos para Aplicaciones, piden constantemente la edad para presentar una serie de datos, pero solo tenemos la curp para calcularla,es por eso que les dejo aquí un función en T-SQL para obtener la edad. Ya la había presentado en Oracle por lo que solo se hicieron algunos ajustes, espero les sirva. Si tienen una forma más simple para calcularla me lo hacen saber por favor.

Create function dbo.fEdadCurp (@Curp char(18))
Returns int
as
Begin
    Declare @Edad int;
    Declare @Año int;
    Declare @Mes int;
    Declare @Dia int;   
    Declare @AñoActual int;
    Declare @MesActual int;
    Declare @DiaActual int;   
   
    Set @AñoActual = Datepart(year,Getdate())
    Set @MesActual = Datepart(month,Getdate())
    Set @DiaActual = Datepart(day,Getdate())
   
    Set @Año = 1900+ Cast (Substring (@curp,5,2) as int);
    Set @Mes = Cast (Substring (@curp,7,2) as int);
    Set @Dia = Cast (Substring (@curp,9,2) as int);
   
    Set @Edad = @AñoActual-@Año-1;
   
    If @MesActual>= @Mes
    Begin
        If @DiaActual>=@Dia
        Begin
            Set @Edad = @Edad +1;
        End 
    End    
    Return (@Edad);
End;

Referencias:

http://msdn.microsoft.com/es-es/library/ms186755.aspx
http://blog.sqlauthority.com/2007/07/07/sql-server-convert-text-to-numbers-integer-cast-and-convert/
http://msdn.microsoft.com/es-es/library/ms174420.aspx
http://www.mssqltips.com/sqlservertip/1712/sql-server-function-to-convert-integer-date-to-datetime-format/