none
Consulta sql RRS feed

  • Pregunta

  • Buenas tardes amigos

    Tengo un problema y necesito de vuestra ayuda por favor

    tengo un vendedor que vende a varios clientes

    entonces necesito un listado donde me muestre las dos ultimas fechas de venta de ese cliente

    por ejemplo 

    cliente   fechaventa anterior  fechaventa      Importe anterior    ultimo importe

    43001    16/01/2017          06/03/2017         100€                        300€

    43002    10/12/2016          06/03/2017         30€                        500€

    esta es mi columna 

    Lógicamente esa consulta esta mal no se como hacer que el cliente 43004445 me muestre el mas antiguo

    es decir las dos fecha de envío que se realizo a ese cliente pero lo necesito por columna

    es posible

    Saludos


    ruben

    lunes, 6 de marzo de 2017 16:34

Respuestas

  • Ruben Lezcano,

    Cuando presentes estos casos escribe por nosotros un escenario de pruebas con las tablas involucradas y datos de prueba en forma de consultas sql y deja bien claro el gestor de base de datos con el que trabajas, en este caso MySql.

    SELECT DISTINCT
        p.cliente, p.vendedor, p.fechaenvio, p.jinez
    FROM 
        poee p
    WHERE
        p.fechaenvio IN
        (
            SELECT MAX(p1.fechaenvio)
    	    FROM poee p1
    	    WHERE (p.cliente = p1.cliente) AND (p.vendedor = p1.vendedor)
        )
        OR p.fechaenvio IN
        (
            SELECT MAX(p1.fechaenvio)
    	    FROM poee p1
    	    WHERE (p.cliente = p1.cliente) AND (p.vendedor = p1.vendedor)
    	        AND (p1.fechaenvio <> 
    	            (
    	                SELECT MAX(p2.fechaenvio)
                	    FROM poee p2
                	    WHERE (p.cliente = p2.cliente) AND (p.vendedor = p2.vendedor)
    	            ))
        )
        AND p.vendedor = '033'
    ORDER BY
        p.cliente, p.vendedor, p.fechaenvio DESC


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    jueves, 9 de marzo de 2017 4:24

Todas las respuestas

  • pero eso lo quieres en sql server? porque la sintaxis que pones parece de postgress

    lo digo por que si utilizo cross apply y funciones de ranking no te valdrá...

    dinos en que server es por intentar ajustar la sintaxis.. aunque aquí mayormente sabemos de SQL Server


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    lunes, 6 de marzo de 2017 17:16
    Moderador
  • es para Mysql 

    Se que debo ir a un foro de Mysql 

    Pero como aqui están los mas grandes maestros :)

    saludos


    ruben

    lunes, 6 de marzo de 2017 17:27
  • Ruben Lezcano,

    SELECT DISTINCT
        p.cliente, p.vendedor, p.fechaenvio, p.jinez
    FROM 
        poee p
    WHERE
        p.fechaenvio IN
        (
    	   SELECT p1.fechaenvio
    	   FROM poee p1
    	   WHERE (p.cliente = p1.cliente) AND (p.vendedor = p1.vendedor)
    	   ORDER BY p1.fechaenvio DESC LIMIT 2
        )
        AND p.vendedor = @vendedor
    ORDER BY 
        p.cliente, p.fechaenvio DESC


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    lunes, 6 de marzo de 2017 17:49
  • Willams no funciona y le quito el limit y tarda que no carga

    he probado esto y nada

    SELECT DISTINCT
        p.cliente, p.vendedor, p.fechaenvio, p.jinez
    FROM 
        poee p
    WHERE
        p.fechaenvio IN
        (
    	   SELECT  p1.cliente, p1.fechaenvio
    	   FROM poee p1
    	   WHERE (p.cliente = p1.cliente) AND (p.vendedor = p1.vendedor)
    	   ORDER BY p1.fechaenvio 
        )
        AND p.vendedor = 021
    ORDER BY 
        p.cliente, p.fechaenvio DESC
    LIMIT 2

    saludos


    ruben

    lunes, 6 de marzo de 2017 18:31
  • me da este error

    Error Code : 1241
    Operand should contain 1 column(s)
    (0 ms taken)


    ruben

    lunes, 6 de marzo de 2017 18:31
  • Ruben,

    No basta con que nos digas "no funciona", ¿obtienes algún mensaje de error sobre la consulta que yo te he proporcionado? El error que mencionas se produce por los cambios que has realizado y que no son correctos porque sólo se puede especificar una expresión en la lista de selección cuando se haces uso del predicado IN().

    ¿Cuántas filas tiene la tabla [poee]?

    lunes, 6 de marzo de 2017 18:38
  • este es el error willams

    Error Code : 1241
    Operand should contain 1 column(s)
    (0 ms taken)

    Sera por que es para mysql el error

    tiene mas de 35.000 registros


    ruben

    lunes, 6 de marzo de 2017 20:43
  • Willams hay otra forma es decir de hacer una primera consulta obtener el dato cargar el datagrid con la fecha antepenultima y luego hacer otra consulta y cargar el mismo datagrid  con la fecha ultima 

    saludos


    ruben

    lunes, 6 de marzo de 2017 20:49
  • este es el error willams

    Error Code : 1241
    Operand should contain 1 column(s)
    (0 ms taken)

    Sera por que es para mysql el error

    tiene mas de 35.000 registros


    ruben

    La consulta sql que te he proporcionado considera la sintaxis sql para MySql, no deberías tener problemas. El mensaje de error que adjuntas se produce porque especificas mas de una columna en la sub-consulta, acción que no es permitida cuando haces uso del operador IN() y no corresponde al código que yo te he proporcionado.

    Ejecuta el código tal y como lo he escrito y adjunta el error que obtienes y también el código sql que estás ejecutando.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    lunes, 6 de marzo de 2017 21:35
  • Si te da problema el LIMIT puedes usar un TOP 2

    SELECT DISTINCT p.cliente, p.vendedor, p.fechaenvio, p.jinez FROM poee p WHERE p.fechaenvio IN ( SELECT TOP 2 p1.fechaenvio FROM poee p1 WHERE (p.cliente = p1.cliente) AND (p.vendedor = p1.vendedor) ORDER BY p1.fechaenvio ) AND p.vendedor = @vendedor ORDER BY p.cliente, p.fechaenvio DESC

    lunes, 6 de marzo de 2017 21:47
  • Willams 

    este es el codigo con el error

    

    saludos


    ruben

    martes, 7 de marzo de 2017 8:28
  • Hola JCBP top no me deja utilizar en mysql

    saludos


    ruben

    martes, 7 de marzo de 2017 8:29
  • Si le quito el limit se queda trabajando y no muestra nada

    saludos


    ruben

    martes, 7 de marzo de 2017 8:34
  • Willams he ejecutado la primera parte del codigo y me arroja este resultado

    pero cuando ejecuto todo no arroja nada como veras le quite el limit y se queda pensando

    saludos


    ruben

    martes, 7 de marzo de 2017 8:37
  • Amigos lo estoy intentado solucionar asi

    si es un registro bien me muestra perfecto asi

    pero como son mas de 500 clientes han pasado mas de 5 min y no termina de cargar

    como puedo mejorar el codigo

      private void pueba()
            {
                string codigovendedor = Convert.ToString(comboBox1.SelectedValue);
                decimal importeanterior = 0;
    
                DataTable dDetalle = new DataTable();
                using (MySqlConnection cn = new MySqlConnection(CadenaConexionGestion))
                {
                    #region Tablet
                    if (rbtablet.Checked)
                    {
                        using (MySqlCommand cmd = new MySqlCommand())
                        {
                            cmd.Connection = cn;
                            cn.Open();
    
                            string query1 = @"SELECT DISTINCT 
                                                p.cliente, p.vendedor, p.fechaenvio, p.jinez
                                            FROM 
                                                poee p
                                            WHERE p.vendedor = @vendedor and devolucion =0 and formaped=1 
                                            order by p.fechaenvio desc";
    
                            cmd.Connection = cn;
                            cmd.CommandType = System.Data.CommandType.Text;
                            cmd.CommandTimeout = 300;
                            cmd.Parameters.AddWithValue("@vendedor", codigovendedor);
                            cmd.CommandType = CommandType.Text;
                            cmd.CommandText = query1;
    
                            MySqlDataAdapter da = new MySqlDataAdapter(query1, CadenaConexionGestion);
    
                            da.SelectCommand = cmd;
                            da.Fill(dDetalle); //Llenamos el data Table Creado al inicio
    
    
                            DataTable dt = GetDataTable(); //rellenamos el Datatable con las columnas correspondientes
    
                            //  int sumacantidad_familia = 0;
    
                            for (int i = 0; i < dDetalle.Rows.Count; i++)
                            {
    
    
                                DataRow dr = dDetalle.Rows[i];
                                DataRow newRow = dt.NewRow();
    
                                newRow["cliente"] = dr["cliente"];
                                int cliente = Convert.ToInt32(dr["cliente"]);
    
                                newRow["vendedor"] = dr["vendedor"];
                                newRow["fechaenvio_ultimo"] = dr["fechaenvio"];
                                DateTime fechaultima = Convert.ToDateTime(dr["fechaenvio"]);
                                newRow["importe_ultimo"] = dr["jinez"];
    
                                #region consultamos la otra fecha de venta
                                DataTable dDetalle2 = new DataTable();
                                using (MySqlConnection cn2 = new MySqlConnection(CadenaConexionGestion))
                                {
                                    using (MySqlCommand cmd2 = new MySqlCommand())
                                    {
                                        cmd2.Connection = cn2;
                                        cn2.Open();
    
                                        string query12 = @"SELECT p.cliente, p.vendedor, p.fechaenvio, p.jinez
                                                    FROM  poee p
                                            WHERE p.formaped = 1 and p.cliente= @cliente2 and p.vendedor = @vendedor2 and devolucion =0 and p.fechaenvio < @desde2
                                            order by p.fechaenvio desc limit 1";
    
                                        cmd2.Connection = cn2;
                                        cmd2.CommandType = System.Data.CommandType.Text;
                                        cmd2.CommandTimeout = 300;
                                        cmd2.Parameters.AddWithValue("@desde2", fechaultima);
                                        cmd2.Parameters.AddWithValue("@vendedor2", codigovendedor);
                                        cmd2.Parameters.AddWithValue("@cliente2", cliente);
                                        cmd2.CommandType = CommandType.Text;
                                        cmd2.CommandText = query12;
    
                                        MySqlDataAdapter da2 = new MySqlDataAdapter(query12, CadenaConexionGestion);
    
                                        da2.SelectCommand = cmd2;
                                        da2.Fill(dDetalle2); //Llenamos el data Table Creado al inicio
                                        for (int j = 0; j < dDetalle2.Rows.Count; j++)
                                        {
                                            DataRow dr2 = dDetalle2.Rows[j];
    
                                            fecha2 = Convert.ToDateTime(dr2["fechaenvio"]);
                                           importeanterior = Convert.ToDecimal(dr2["jinez"]);
    
                                        }
                                        cn2.Close();
                                    }
                                }
    
    
                                #endregion
    
    
                                newRow["fechaenvio_anterior"] = fecha2;
                                newRow["importe_anterior"] = importeanterior;
    
    
    
                                dt.Rows.Add(newRow);
                                }
    
                            cn.Close();
          
    
                                this.dataGridView1.DataSource = dt;

    saludos


    ruben

    martes, 7 de marzo de 2017 11:35
  • Ruben Lezcano,

    Cuando presentes estos casos escribe por nosotros un escenario de pruebas con las tablas involucradas y datos de prueba en forma de consultas sql y deja bien claro el gestor de base de datos con el que trabajas, en este caso MySql.

    SELECT DISTINCT
        p.cliente, p.vendedor, p.fechaenvio, p.jinez
    FROM 
        poee p
    WHERE
        p.fechaenvio IN
        (
            SELECT MAX(p1.fechaenvio)
    	    FROM poee p1
    	    WHERE (p.cliente = p1.cliente) AND (p.vendedor = p1.vendedor)
        )
        OR p.fechaenvio IN
        (
            SELECT MAX(p1.fechaenvio)
    	    FROM poee p1
    	    WHERE (p.cliente = p1.cliente) AND (p.vendedor = p1.vendedor)
    	        AND (p1.fechaenvio <> 
    	            (
    	                SELECT MAX(p2.fechaenvio)
                	    FROM poee p2
                	    WHERE (p.cliente = p2.cliente) AND (p.vendedor = p2.vendedor)
    	            ))
        )
        AND p.vendedor = '033'
    ORDER BY
        p.cliente, p.vendedor, p.fechaenvio DESC


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    jueves, 9 de marzo de 2017 4:24