none
optimizar en un stored procedure mi consulta multi select count RRS feed

  • Pregunta

  • buenas tardes , tengo esta consulta para realizar conteos de una tabla llamada consulta que bajo ciertos criterios puedo contarla :                                                                      

       SqlConnection cnn = new SqlConnection(Cx);
                cnn.Open();
                int semana = m;
                int año = a;
                string clues = c;
                int cuantos = 0;
                string query = "SELECT * FROM catsuive";
                SqlCommand cmd = new SqlCommand(query, cnn);
                SqlDataReader leer;
                leer = cmd.ExecuteReader();

                while (leer.Read() == true)
                {
                    string cat = leer["claveepi"].ToString();

                    string queryconsulta = "SELECT * FROM consulta where semana=" + semana + " and año=" + año + " and idclues='" + clues + "'";
                    SqlCommand cmdconsulta = new SqlCommand(queryconsulta, cnn);
                    SqlDataReader leerconsulta = cmdconsulta.ExecuteReader();

                    while (leerconsulta.Read() == true)
                    {

                        string claveepi = leerconsulta["claveepi"].ToString();

                        if (!(String.IsNullOrEmpty(claveepi)))
                        {

                            if (cat == claveepi)
                            {
                                int id = cuantos++;


                                DateTime fecha = Convert.ToDateTime(leerconsulta["fecha"]);

                                int diag = Convert.ToInt32(leerconsulta["iddiagnostico"]);

                                int mes = Convert.ToInt32(leerconsulta["mes"]);


                                string query1 = "SELECT COUNT(*) FROM catsuive INNER JOIN consulta ON catsuive.claveepi = consulta.claveepi INNER JOIN pacientes ON consulta.idpac = pacientes.id WHERE consulta.claveepi = '" + leer["claveepi"].ToString() + "' and consulta.pri_sub = 1 and pacientes.edad <1 and pacientes.sexo = 1 and consulta.semana=" + semana + " and consulta.año=" + año + " and consulta.idclues='" + clues + "'";
                                SqlCommand cmd1 = new SqlCommand(query1, cnn);
                                int count1 = Convert.ToInt32(cmd1.ExecuteScalar());

                                string query2 = "SELECT COUNT(*) FROM catsuive INNER JOIN consulta ON catsuive.claveepi = consulta.claveepi INNER JOIN pacientes ON consulta.idpac = pacientes.id WHERE consulta.claveepi = '" + leer["claveepi"].ToString() + "' and consulta.pri_sub = 1 and pacientes.edad <1 and pacientes.sexo = 2 and consulta.semana=" + semana + " and consulta.año=" + año + " and consulta.idclues='" + clues + "'";
                                SqlCommand cmd222 = new SqlCommand(query2, cnn);
                                int count2 = Convert.ToInt32(cmd222.ExecuteScalar());

    lo que quisiera es hacerlo en un stored procedure con parametros y n ose si esto pudiera funcionar :

    Create Procedure Test(@clave varchar ,@semana int, @año int, @clues int)
    As
    /* set nocount on */ 
    select count (*) as con1 from catsuive as A join consulta as TA on A.claveepi=TA.claveepi join pacientes as T on T.id=TA.idpac where TA.claveepi=@clave and TA.pri_sub=1 and T.edad<1 and T.sexo=1 and TA.semana=@semana and TA.año=@año and TA.idclues=@clues;
    select count (*) as con2 from catsuive as A join consulta as TA on A.claveepi=TA.claveepi join pacientes as T on T.id=TA.idpac where TA.claveepi=@clave and TA.pri_sub=1 and T.edad<1 and T.sexo=2 and TA.semana=@semana and TA.año=@año and TA.idclues=@clues;

    Return

    gracias de antemano


    viernes, 2 de agosto de 2019 19:33

Todas las respuestas

  • Hola rodrigo_ornelas:

    Y porque no devuelves las dos cuentas en la misma estructura, en vez de en dos.

    CREATE PROCEDURE Test
    (@clave  VARCHAR, 
     @semana INT, 
     @año    INT, 
     @clues  INT
    )
    AS
    
         /* set nocount on */
    
         SELECT COUNT(*) AS con1, T.SEXO
         FROM catsuive AS A
              JOIN consulta AS TA ON A.claveepi = TA.claveepi
              JOIN pacientes AS T ON T.id = TA.idpac
         WHERE TA.claveepi = @clave
               AND TA.pri_sub = 1
               AND T.edad < 1
               AND T.sexo IN (1,2)
               AND TA.semana = @semana
               AND TA.año = @año
               AND TA.idclues = @clues
        GROUP BY T.SEXO

    El resultado te puede retornar dos filas máximo, 1 por cada sexo de los valores 1 y 2 incluidos en AND sexo in (1,2), con dos columnas, una con el número de cada uno y otra con el número 1 o el número 2.


    sábado, 3 de agosto de 2019 7:33
  • muy buena opción, lo malo es que en realidad debo hacer lo siguiente:

    de un catalogo de enfermedades (tabla cat_suive) debo emparejar registros de consultas medicas que tienen el campo en común id_diag(identificador de diagnostico), después debo emparejar los datos de paciente con la tabla de consultas que tienen el campo en común id_paciente, y de ahí obtengo los datos de sexo, edad, lo que no se como hacer interactuar el catalogo de enfermedades que tiene mas 200 diagnosticos y que cada uno de ellos verfique que coincida con cada registro de la tabla consultas en algun diagnostico, que si es asi , los criterios de edad son por rangos y de sexo en efecto son F o M , el codigo esta asi segmentado : 

      SqlConnection cnn = new SqlConnection(Cx);
                cnn.Open();
                int semana = m;
                int año = a;
                string clues = c;
                int cuantos = 0;
                string query = "SELECT * FROM catsuive";
                SqlCommand cmd = new SqlCommand(query, cnn);
                SqlDataReader leer;
                leer = cmd.ExecuteReader();

                while (leer.Read() == true)
                {
                    string cat = leer["claveepi"].ToString();

                    string queryconsulta = "SELECT * FROM consulta where semana=" + semana + " and año=" + año + " and idclues='" + clues + "'";
                    SqlCommand cmdconsulta = new SqlCommand(queryconsulta, cnn);
                    SqlDataReader leerconsulta = cmdconsulta.ExecuteReader();

                    while (leerconsulta.Read() == true)
                    {

                        string claveepi = leerconsulta["claveepi"].ToString();

                        if (!(String.IsNullOrEmpty(claveepi)))
                        {

                            if (cat == claveepi)
                            {
                                int id = cuantos++;


                                DateTime fecha = Convert.ToDateTime(leerconsulta["fecha"]);

                                int diag = Convert.ToInt32(leerconsulta["iddiagnostico"]);

                                int mes = Convert.ToInt32(leerconsulta["mes"]);

                                string query1 = "SELECT COUNT(*) FROM catsuive INNER JOIN consulta ON catsuive.claveepi = consulta.claveepi INNER JOIN pacientes ON consulta.idpac = pacientes.id WHERE consulta.claveepi = '" + leer["claveepi"].ToString() + "' and consulta.pri_sub = 1 and pacientes.edad <1 and pacientes.sexo = 1 and consulta.semana=" + semana + " and consulta.año=" + año + " and consulta.idclues='" + clues + "'";
                                SqlCommand cmd1 = new SqlCommand(query1, cnn);
                                int count1 = Convert.ToInt32(cmd1.ExecuteScalar());
                            
                                string query2 = "SELECT COUNT(*) FROM catsuive INNER JOIN consulta ON catsuive.claveepi = consulta.claveepi INNER JOIN pacientes ON consulta.idpac = pacientes.id WHERE consulta.claveepi = '" + leer["claveepi"].ToString() + "' and consulta.pri_sub = 1 and pacientes.edad <1 and pacientes.sexo = 2 and consulta.semana=" + semana + " and consulta.año=" + año + " and consulta.idclues='" + clues + "'";
                                SqlCommand cmd222 = new SqlCommand(query2, cnn);
                                int count2 = Convert.ToInt32(cmd222.ExecuteScalar());
                                                         
                                string query3 = "SELECT COUNT(*) FROM catsuive INNER JOIN consulta ON catsuive.claveepi = consulta.claveepi INNER JOIN pacientes ON consulta.idpac = pacientes.id WHERE consulta.claveepi = '" + leer["claveepi"].ToString() + "' and consulta.pri_sub = 1 and pacientes.edad in (1,2,3,4) and pacientes.sexo = 1 and consulta.semana=" + semana + " and consulta.año=" + año + " and consulta.idclues='" + clues + "'";
                                SqlCommand cmd333 = new SqlCommand(query3, cnn);
                                int count3 = Convert.ToInt32(cmd333.ExecuteScalar());
                             
                                string query4 = "SELECT COUNT(*) FROM catsuive INNER JOIN consulta ON catsuive.claveepi = consulta.claveepi INNER JOIN pacientes ON consulta.idpac = pacientes.id WHERE consulta.claveepi = '" + leer["claveepi"].ToString() + "' and consulta.pri_sub = 1 and pacientes.edad in (1,2,3,4) and pacientes.sexo = 2 and consulta.semana=" + semana + " and consulta.año=" + año + " and consulta.idclues='" + clues + "'";
                                SqlCommand cmd4 = new SqlCommand(query4, cnn);
                                int count4 = Convert.ToInt32(cmd4.ExecuteScalar());
                                
                                string query5 = "SELECT COUNT(*) FROM catsuive INNER JOIN consulta ON catsuive.claveepi = consulta.claveepi INNER JOIN pacientes ON consulta.idpac = pacientes.id WHERE consulta.claveepi = '" + leer["claveepi"].ToString() + "' and consulta.pri_sub = 1 and pacientes.edad in (5,6,7,9) and pacientes.sexo = 1 and consulta.semana=" + semana + " and consulta.año=" + año + " and consulta.idclues='" + clues + "'";
                                SqlCommand cmd5 = new SqlCommand(query1, cnn);
                                int count5 = Convert.ToInt32(cmd5.ExecuteScalar());
                               
                                string query6 = "SELECT COUNT(*) FROM catsuive INNER JOIN consulta ON catsuive.claveepi = consulta.claveepi INNER JOIN pacientes ON consulta.idpac = pacientes.id WHERE consulta.claveepi = '" + leer["claveepi"].ToString() + "' and consulta.pri_sub = 1 and pacientes.edad in (5,6,7,9) and pacientes.sexo = 2 and consulta.semana=" + semana + " and consulta.año=" + año + " and consulta.idclues='" + clues + "'";
                                SqlCommand cmd6 = new SqlCommand(query6, cnn);
                                int count6 = Convert.ToInt32(cmd6.ExecuteScalar());
                                                          
                                string query7 = "SELECT COUNT(*) FROM catsuive INNER JOIN consulta ON catsuive.claveepi = consulta.claveepi INNER JOIN pacientes ON consulta.idpac = pacientes.id WHERE consulta.claveepi = '" + leer["claveepi"].ToString() + "' and consulta.pri_sub = 1 and pacientes.edad in (10,11,12,13,14) and pacientes.sexo = 1 and consulta.semana=" + semana + " and consulta.año=" + año + " and consulta.idclues='" + clues + "'";
                                SqlCommand cmd7 = new SqlCommand(query7, cnn);
                                int count7 = Convert.ToInt32(cmd7.ExecuteScalar());
                                
                                string query8 = "SELECT COUNT(*) FROM catsuive INNER JOIN consulta ON catsuive.claveepi = consulta.claveepi INNER JOIN pacientes ON consulta.idpac = pacientes.id WHERE consulta.claveepi = '" + leer["claveepi"].ToString() + "' and consulta.pri_sub = 1 and pacientes.edad in (10,11,12,13,14) and pacientes.sexo = 2 and consulta.semana=" + semana + " and consulta.año=" + año + " and consulta.idclues='" + clues + "'";
                                SqlCommand cmd8 = new SqlCommand(query8, cnn);
                                int count8 = Convert.ToInt32(cmd8.ExecuteScalar());
                               
                                string query9 = "SELECT COUNT(*) FROM catsuive INNER JOIN consulta ON catsuive.claveepi = consulta.claveepi INNER JOIN pacientes ON consulta.idpac = pacientes.id WHERE consulta.claveepi = '" + leer["claveepi"].ToString() + "' and consulta.pri_sub = 1 and pacientes.edad in (15,16,17,18,19) and pacientes.sexo = 1 and consulta.semana=" + semana + " and consulta.año=" + año + " and consulta.idclues='" + clues + "'";
                                SqlCommand cmd9 = new SqlCommand(query9, cnn);
                                int count9 = Convert.ToInt32(cmd9.ExecuteScalar());
                               
                                string query10 = "SELECT COUNT(*) FROM catsuive INNER JOIN consulta ON catsuive.claveepi = consulta.claveepi INNER JOIN pacientes ON consulta.idpac = pacientes.id WHERE consulta.claveepi = '" + leer["claveepi"].ToString() + "' and consulta.pri_sub = 1 and pacientes.edad in (15,16,17,18,19) and pacientes.sexo = 2 and consulta.semana=" + semana + " and consulta.año=" + año + " and consulta.idclues='" + clues + "'";
                                SqlCommand cmd10 = new SqlCommand(query10, cnn);
                                int count10 = Convert.ToInt32(cmd10.ExecuteScalar());
                                                            
                                string query11 = "SELECT COUNT(*) FROM catsuive INNER JOIN consulta ON catsuive.claveepi = consulta.claveepi INNER JOIN pacientes ON consulta.idpac = pacientes.id WHERE consulta.claveepi = '" + leer["claveepi"].ToString() + "' and consulta.pri_sub = 1 and pacientes.edad in (20,21,22,23,24) and pacientes.sexo = 1 and consulta.semana=" + semana + " and consulta.año=" + año + " and consulta.idclues='" + clues + "'";
                                SqlCommand cmd11 = new SqlCommand(query11, cnn);
                                int count11 = Convert.ToInt32(cmd11.ExecuteScalar());
                               
                                string query12 = "SELECT COUNT(*) FROM catsuive INNER JOIN consulta ON catsuive.claveepi = consulta.claveepi INNER JOIN pacientes ON consulta.idpac = pacientes.id WHERE consulta.claveepi = '" + leer["claveepi"].ToString() + "' and consulta.pri_sub = 1 and pacientes.edad in (20,21,22,23,24) and pacientes.sexo = 2 and consulta.semana=" + semana + " and consulta.año=" + año + " and consulta.idclues='" + clues + "'";
                                SqlCommand cmd12 = new SqlCommand(query12, cnn);
                                int count12 = Convert.ToInt32(cmd12.ExecuteScalar());
                               
                                string query13 = "SELECT COUNT(*) FROM catsuive INNER JOIN consulta ON catsuive.claveepi = consulta.claveepi INNER JOIN pacientes ON consulta.idpac = pacientes.id WHERE consulta.claveepi = '" + leer["claveepi"].ToString() + "' and consulta.pri_sub = 1 and pacientes.edad in (25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44) and pacientes.sexo = 1 and consulta.semana=" + semana + " and consulta.año=" + año + " and consulta.idclues='" + clues + "'";
                                SqlCommand cmd13 = new SqlCommand(query13, cnn);
                                int count13 = Convert.ToInt32(cmd13.ExecuteScalar());
                               
                                string query14 = "SELECT COUNT(*) FROM catsuive INNER JOIN consulta ON catsuive.claveepi = consulta.claveepi INNER JOIN pacientes ON consulta.idpac = pacientes.id WHERE consulta.claveepi = '" + leer["claveepi"].ToString() + "' and consulta.pri_sub = 1 and pacientes.edad in (25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44) and pacientes.sexo = 2 and consulta.semana=" + semana + " and consulta.año=" + año + " and consulta.idclues='" + clues + "'";
                                SqlCommand cmd14 = new SqlCommand(query14, cnn);
                                int count14 = Convert.ToInt32(cmd14.ExecuteScalar());
                                                         
                                string query15 = "SELECT COUNT(*) FROM catsuive INNER JOIN consulta ON catsuive.claveepi = consulta.claveepi INNER JOIN pacientes ON consulta.idpac = pacientes.id WHERE consulta.claveepi = '" + leer["claveepi"].ToString() + "' and consulta.pri_sub = 1 and pacientes.edad in (45,46,47,48,49) and pacientes.sexo = 1 and consulta.semana=" + semana + " and consulta.año=" + año + " and consulta.idclues='" + clues + "'";
                                SqlCommand cmd15 = new SqlCommand(query15, cnn);
                                int count15 = Convert.ToInt32(cmd15.ExecuteScalar());
                              
                                string query16 = "SELECT COUNT(*) FROM catsuive INNER JOIN consulta ON catsuive.claveepi = consulta.claveepi INNER JOIN pacientes ON consulta.idpac = pacientes.id WHERE consulta.claveepi = '" + leer["claveepi"].ToString() + "' and consulta.pri_sub = 1 and pacientes.edad in (45,46,47,48,49) and pacientes.sexo = 2 and consulta.semana=" + semana + " and consulta.año=" + año + " and consulta.idclues='" + clues + "'";
                                SqlCommand cmd16 = new SqlCommand(query16, cnn);
                                int count16 = Convert.ToInt32(cmd16.ExecuteScalar());
                               
                                string query17 = "SELECT COUNT(*) FROM catsuive INNER JOIN consulta ON catsuive.claveepi = consulta.claveepi INNER JOIN pacientes ON consulta.idpac = pacientes.id WHERE consulta.claveepi = '" + leer["claveepi"].ToString() + "' and consulta.pri_sub = 1 and pacientes.edad in (50,51,52,53,54,55,56,57,58,59) and pacientes.sexo = 1 and consulta.semana=" + semana + " and consulta.año=" + año + " and consulta.idclues='" + clues + "'";
                                SqlCommand cmd17 = new SqlCommand(query17, cnn);
                                int count17 = Convert.ToInt32(cmd17.ExecuteScalar());
                                
                                string query18 = "SELECT COUNT(*) FROM catsuive INNER JOIN consulta ON catsuive.claveepi = consulta.claveepi INNER JOIN pacientes ON consulta.idpac = pacientes.id WHERE consulta.claveepi = '" + leer["claveepi"].ToString() + "' and consulta.pri_sub = 1 and pacientes.edad in (50,51,52,53,54,55,56,57,58,59) and pacientes.sexo = 2 and consulta.semana=" + semana + " and consulta.año=" + año + " and consulta.idclues='" + clues + "'";
                                SqlCommand cmd18 = new SqlCommand(query18, cnn);
                                int count18 = Convert.ToInt32(cmd18.ExecuteScalar());
                               
                                string query19 = "SELECT COUNT(*) FROM catsuive INNER JOIN consulta ON catsuive.claveepi = consulta.claveepi INNER JOIN pacientes ON consulta.idpac = pacientes.id WHERE consulta.claveepi = '" + leer["claveepi"].ToString() + "' and consulta.pri_sub = 1 and pacientes.edad in (60,61,62,63,64) and pacientes.sexo = 1 and consulta.semana=" + semana + " and consulta.año=" + año + " and consulta.idclues='" + clues + "'";
                                SqlCommand cmd19 = new SqlCommand(query19, cnn);
                                int count19 = Convert.ToInt32(cmd19.ExecuteScalar());
                               
                                string query20 = "SELECT COUNT(*) FROM catsuive INNER JOIN consulta ON catsuive.claveepi = consulta.claveepi INNER JOIN pacientes ON consulta.idpac = pacientes.id WHERE consulta.claveepi = '" + leer["claveepi"].ToString() + "' and consulta.pri_sub = 1 and pacientes.edad in (60,61,62,63,64) and pacientes.sexo = 1 and consulta.semana=" + semana + " and consulta.año=" + año + " and consulta.idclues='" + clues + "'";
                                SqlCommand cmd20 = new SqlCommand(query1, cnn);
                                int count20 = Convert.ToInt32(cmd20.ExecuteScalar());
                              
                                string query21 = "SELECT COUNT(*) FROM catsuive INNER JOIN consulta ON catsuive.claveepi = consulta.claveepi INNER JOIN pacientes ON consulta.idpac = pacientes.id WHERE consulta.claveepi = '" + leer["claveepi"].ToString() + "' and consulta.pri_sub = 1 and pacientes.edad > 70 and pacientes.sexo = 1 and consulta.semana=" + semana + " and consulta.año=" + año + " and consulta.idclues='" + clues + "'";
                                SqlCommand cmd21 = new SqlCommand(query1, cnn);
                                int count21 = Convert.ToInt32(cmd21.ExecuteScalar());
                              
                                string query22 = "SELECT COUNT(*) FROM catsuive INNER JOIN consulta ON catsuive.claveepi = consulta.claveepi INNER JOIN pacientes ON consulta.idpac = pacientes.id WHERE consulta.claveepi = '" + leer["claveepi"].ToString() + "' and consulta.pri_sub = 1 and pacientes.edad > 70 and pacientes.sexo = 1 and consulta.semana=" + semana + " and consulta.año=" + año + " and consulta.idclues='" + clues + "'";
                                SqlCommand cmd22 = new SqlCommand(query22, cnn);
                                int count22 = Convert.ToInt32(cmd22.ExecuteScalar());

    sábado, 3 de agosto de 2019 19:46
  • ya lo consegui era hacer esto  :

    CREATE Procedure [dbo].[Test4]
    @clave varchar ,@semana int, @año int, @clues int,@con1 int output,@con2 int output
    As
    BEGIN
    /* set nocount on */ 
    select A.claveepi , count (*) as con1 from consulta as A right join pacientes as B on A.idpac=B.id where A.pri_sub=1 and B.sexo=1 and B.edad >0 and A.semana=@semana and A.año=@año and A.idclues=@clues GROUP BY A.claveepi
    select A.claveepi , count (*) as con1 from consulta as A right join pacientes as B on A.idpac=B.id where A.pri_sub=1 and B.sexo=1 and B.edad >0 and A.semana=@semana and A.año=@año and A.idclues=@clues GROUP BY A.claveepi

    .

    .

    .

    END

    sábado, 3 de agosto de 2019 20:57