none
Consulta 2 valores de un campo RRS feed

  • Pregunta

  • Hola a todos

    Tengo que realizar una consulta pero no se por donde empezar ya que me confunde un doble valor que tiene un campo en un registro. Tengo las siguientes 5 tablas:

    Registro_Llamadas
    id_registro nombre
    2537687 Juan Perez
    2534454 Maria Flores

    Historico_acciones
    id_historico fecha id_registro id_accion cod_accion
    1 10/04/2019 2537687 33 356
    2 10/04/2019 2537687 20 3
    3 11/04/2019 2534454 33 567
    4 11/04/2019 2534454 20 4


    Lista_bases
    id_base descrip_base
    56 Base1
    98 Base2

    Registro_contactos
    id_contacto id_base
    356 56
    567 98

    Estatus_llamada
    id_est estatus
    1 Contactado
    2 Buzon
    3 No contesta
    4 Agendado

    de las cuales tengo que generar el siguiente resultado por rango de fecha

    Fecha id_registro nombre base estatus
    10/04/2019 2537687 Juan Perez Base1 No contesta
    11/04/2019 2534454 Maria Flores Base2 Agendado

    el problema es con el campo id_action de la tabla historico_accion ya que al momento de hacer la consulta no se como indicarle que me traiga los valores de las 2 opciones (33 y 20) en un solo registro (una sola fila) y es que dependiendo del numero seleccionado en id_action el numero de campo cod_accion trae el valor de la base (si el id_accion es 33) o trae el valor del estatus (si el id_accion es 20). al momento de intentar crear el select me crea duplicado de la siguiente manera:

    Fecha id_registro nombre base estatus
    10/04/2019 2537687 Juan Perez Base1 null
    10/04/2019 2537687 Juan Perez null No contesta
    11/04/2019 2534454 Maria Flores Base2 null
    11/04/2019 2534454 Maria Flores null Agendado

    pero por fila solo debe haber un registro por fecha, id_registro, nombre, base y estatus como este:

    Fecha id_registro nombre base estatus
    10/04/2019 2537687 Juan Perez Base1 No contesta
    11/04/2019 2534454 Maria Flores Base2 Agendado

    espero que me puedan ayudar, muchas gracias.

    domingo, 14 de abril de 2019 23:10

Respuestas

  • Hola, en el resultado final podrías probar con

    CREATE TABLE #pruebas
    (
    Fecha        DATETIME,
    id_registro  INT,
    nombre       VARCHAR(100),
    base         VARCHAR(10),
    estatus       VARCHAR(100)
    
    )
    INSERT INTO #pruebas(Fecha,id_registro,nombre,base,estatus) VALUES('10/04/2019',2537687,'Juan Perez','Base1',null)
    INSERT INTO #pruebas(Fecha,id_registro,nombre,base,estatus) VALUES('10/04/2019',2537687,'Juan Perez',null,'No contesta')
    INSERT INTO #pruebas(Fecha,id_registro,nombre,base,estatus) VALUES('11/04/2019',2534454,'Maria Flores','Base2',null)
    INSERT INTO #pruebas(Fecha,id_registro,nombre,base,estatus) VALUES('11/04/2019',2534454,'Maria Flores',null,'Agendado')
    
    SELECT * FROM #pruebas
    
    SELECT Fecha,id_registro, nombre,
    MAX(CASE WHEN base = base THEN base ELSE base END) AS base,
    MAX(CASE WHEN estatus =estatus THEN estatus ELSE estatus END) AS estatus
    FROM #pruebas
    GROUP BY Fecha,id_registro, nombre
    
    --DROP TABLE #pruebas
    


    Votar y marcar respuestas es agradecer.
    Saludos.
    Lima-Perú


    • Editado Augusto1982 lunes, 15 de abril de 2019 2:57
    • Propuesto como respuesta Carlos_Ruiz_M lunes, 15 de abril de 2019 14:04
    • Marcado como respuesta Luarneo martes, 16 de abril de 2019 14:14
    lunes, 15 de abril de 2019 1:51

Todas las respuestas

  • Hola, en el resultado final podrías probar con

    CREATE TABLE #pruebas
    (
    Fecha        DATETIME,
    id_registro  INT,
    nombre       VARCHAR(100),
    base         VARCHAR(10),
    estatus       VARCHAR(100)
    
    )
    INSERT INTO #pruebas(Fecha,id_registro,nombre,base,estatus) VALUES('10/04/2019',2537687,'Juan Perez','Base1',null)
    INSERT INTO #pruebas(Fecha,id_registro,nombre,base,estatus) VALUES('10/04/2019',2537687,'Juan Perez',null,'No contesta')
    INSERT INTO #pruebas(Fecha,id_registro,nombre,base,estatus) VALUES('11/04/2019',2534454,'Maria Flores','Base2',null)
    INSERT INTO #pruebas(Fecha,id_registro,nombre,base,estatus) VALUES('11/04/2019',2534454,'Maria Flores',null,'Agendado')
    
    SELECT * FROM #pruebas
    
    SELECT Fecha,id_registro, nombre,
    MAX(CASE WHEN base = base THEN base ELSE base END) AS base,
    MAX(CASE WHEN estatus =estatus THEN estatus ELSE estatus END) AS estatus
    FROM #pruebas
    GROUP BY Fecha,id_registro, nombre
    
    --DROP TABLE #pruebas
    


    Votar y marcar respuestas es agradecer.
    Saludos.
    Lima-Perú


    • Editado Augusto1982 lunes, 15 de abril de 2019 2:57
    • Propuesto como respuesta Carlos_Ruiz_M lunes, 15 de abril de 2019 14:04
    • Marcado como respuesta Luarneo martes, 16 de abril de 2019 14:14
    lunes, 15 de abril de 2019 1:51
  • Hola Luarneo:

    Te falta algo por contar:

    Fíjate, este es tu escenario

    CREATE TABLE HistoricoAcciones
    (
    id_historico INT,
    Fecha        DATE,
    id_registro  INT,
    id_accion	   INT,
    cod_Accion   INT
    )
    go
    INSERT INTO HistoricoAcciones(id_historico,FECHA,id_registro,id_accion,cod_Accion)
     VALUES
     (1,'20190410',2537687,33,356),
     (2,'20190410',2537687,20,3),
     (3,'20190411',2534454,33,567),
     (4,'20190411',2534454,20,4);
    
    GO
    CREATE TABLE REGISTRO_LLAMADAS
    (
      id_registro INT
    , nombre      VARCHAR(100)
    );
     GO
     insert into REGISTRO_LLAMADAS(id_registro,nombre)
     values
     (2537687, 'JUAN PEREZ'),(2534454,'MARIA FLORES');
    
    GO
    CREATE TABLE LISTA_BASES
    (
     ID_BASE	   INT,
    DESCRIP_BASE VARCHAR(100)
    );
    GO
    INSERT INTO LISTA_BASES (ID_BASE, DESCRIP_BASE)
    VALUES
    (56,'BASE1'),(98,'BASE2');
    GO
    CREATE TABLE REGISTRO_CONTACTOS 
    (
      ID_CONTACTO	 INT
    , ID_BASE		 INT
    )
    GO
    INSERT INTO REGISTRO_CONTACTOS (ID_CONTACTO, ID_BASE)
    VALUES
    (356,56),(567,98);
    GO
    CREATE TABLE ESTATUS_LLAMADA 
    (
      ID_EST	  INT
    , ESTATUS	  VARCHAR(100)
    );
    GO
    INSERT INTO ESTATUS_LLAMADA(ID_EST, ESTATUS)
    VALUES
    (1,'CONTACTADO'),(2,'BUZON'),(3,'NO CONTESTA'),(4,'AGENDADO');
    GO
    

    Hasta aquí lo único que he realizado es crear las tablas e insertar los valores que tú muestras.

    SELECT H.Fecha, H.id_registro, R.nombre, B.DESCRIP_BASE FROM 
        HistoricoACCIONES H 
        INNER JOIN REGISTRO_LLAMADAS R ON H.id_registro = R.id_registro
        INNER JOIN REGISTRO_CONTACTOS C ON H.cod_Accion = C.ID_CONTACTO
        INNER JOIN LISTA_BASES B ON C.ID_BASE = B.ID_BASE

    Relaciono todas las tablas excepto el estado para obtener esta salida.

    Salida

    Pero como se relaciona el estado con las llamadas. Yo díría que te falta una columna en historicoAcciones, que diga id_status o similar.

    Si este es tu escenario, solo tienes que añadir la relaccion a Estatus_llamada con un inner join ESTATUS_LLAMADA l on h.id_estatus = l.id_est e incluir en la select l.Estatus

    Si no es el caso, creo que tienes que aportar algo más.

    • Propuesto como respuesta Carlos_Ruiz_M lunes, 15 de abril de 2019 14:04
    lunes, 15 de abril de 2019 4:51
  • Muchas gracias por la respuesta de sirvió de mucho

    martes, 16 de abril de 2019 14:09
  • De nada
    martes, 16 de abril de 2019 16:15