none
Obtener otros datos que estan sobre la misma tabla origen RRS feed

  • Pregunta

  • Hola,

    La siguiente consulta:

    select d.cfolio [Folio], 
    cast(d.cfecha AS DATE) [Fecha Factura],
    f.cuuid [UUID], 
    f.ccadpedi [UUID Relacionado]
    from admFoliosDigitales f
    inner join admDocumentos d on d.ciddocumento = f.ciddocto
    and d.ciddocumentode = 4
    and d.cfecha between '20190101' and '20190822'

    Me devuelve estos resultados

    lo que necesito ahora es del dato de la columna ccadpedi/UUID Relacionado, buscar ese string nuevamente en la tabla admFoliosDigitales y obtener datos como folio y fecha cancelación, es decir algo así como una subconsulta:

    select cfolio, cuuid, cast(cfechacanc AS DATE) [Fecha Cancelación] from admFoliosDigitales where cuuid = '83236F69-8CB2-4FBE-8D65-C5E3E264A0DE'

    Pero esto es siempre y cuando la columna ccadpedi no sea null.

    Cómo puedo resolver este requerimiento?.

    Agradezco su ayuda.

    Saludos,
    Javier

    • Editado jparada jueves, 22 de agosto de 2019 22:32
    jueves, 22 de agosto de 2019 22:20

Respuestas

  • Hola jparada:

    Lo hiciste casi bien, pero te falto igualar ambas condiciones.

    CREATE TABLE admDocumentos
    (cfolio         VARCHAR(100), 
     cfecha         DATETIME, 
     ciddocumento   VARCHAR(100), 
     ciddocumentode INT
    );
    CREATE TABLE admFoliosDigitales
    (cuuid      varchar(100), 
     ccadpedi   text NULL, 
     ciddocto   VARCHAR(60) NOT NULL, 
     cfechacanc DATETIME
    );
    GO
    INSERT INTO admDocumentos (cfolio, cfecha, CIDDOCUMENTO, ciddocumentode)
    values
    ('100','20190101','1a',4),
    ('100','20190102','2a',4);
    go
    
    insert into admFoliosDigitales (cuuid, ccadpedi, ciddocto, cfechacanc)
    VALUES
    ('028F1B2A-6093-40EB-AD92-A973568A74CA', null, '1a','20190303'),
    (cast(newid() as varchar(60)), '028F1B2A-6093-40EB-AD92-A973568A74CA','1a',null),
    (cast(newid() as varchar(60)), null, '2a', '20190104');
    go
    SELECT d.cfolio [Folio], 
           CAST(d.cfecha AS DATE) [Fecha Factura], 
           f.cuuid [UUID], 
           f.ccadpedi [UUID Relacionado], 
           g.cuuid, 
           g.ccadpedi, 
           g.ciddocto, 
           g.cfechacanc
    FROM admFoliosDigitales f
         LEFT JOIN admFoliosDigitales g ON CAST(f.ccadpedi AS VARCHAR(60)) = g.cuuid
         INNER JOIN admDocumentos d ON d.ciddocumento = f.ciddocto
    WHERE d.ciddocumentode = 4
          AND d.cfecha BETWEEN '20190101' AND '20190822';

    Los obsoletos campos text, se puede castear a varchar, pero no a un tamaño inespecífico, sino a un tamaño que permita el tamaño de los datos. Si observas, solo he añadido el tamaño de la columna.

    Ya comentas.

    • Marcado como respuesta jparada lunes, 26 de agosto de 2019 14:47
    sábado, 24 de agosto de 2019 15:44

Todas las respuestas

  • Hola jparada:

    Tu escenario

    CREATE TABLE admDocumentos
    (cfolio         VARCHAR(100), 
     cfecha         DATETIME, 
     ciddocumento   VARCHAR(100), 
     ciddocumentode INT
    );
    CREATE TABLE admFoliosDigitales
    (cuuid      UNIQUEIDENTIFIER, 
     ccadpedi   UNIQUEIDENTIFIER, 
     ciddocto   VARCHAR(100), 
     cfechacanc DATETIME
    );
    GO
    INSERT INTO admDocumentos (cfolio, cfecha, CIDDOCUMENTO, ciddocumentode)
    values
    ('100','20190101','1a',4),
    ('100','20190102','2a',4);
    go
    
    insert into admFoliosDigitales (cuuid, ccadpedi, ciddocto, cfechacanc)
    VALUES
    ('028F1B2A-6093-40EB-AD92-A973568A74CA', null, '1a','20190303'),
    (newid(), '028F1B2A-6093-40EB-AD92-A973568A74CA','1a',null),
    (newid(), null, '2a', '20190104');
    go

    El segundo registro tiene como guid relacionado el correspondiente a la primera fila.

    Solución

    SELECT d.cfolio [Folio], 
           CAST(d.cfecha AS DATE) [Fecha Factura], 
           f.cuuid [UUID], 
           f.ccadpedi [UUID Relacionado], 
           g.cuuid, 
           g.ccadpedi, 
           g.ciddocto, 
           g.cfechacanc
    FROM admFoliosDigitales f
         LEFT JOIN admFoliosDigitales g ON f.ccadpedi = g.cuuid
         INNER JOIN admDocumentos d ON d.ciddocumento = f.ciddocto
    WHERE d.ciddocumentode = 4
          AND d.cfecha BETWEEN '20190101' AND '20190822';

    Relacionas otra vez el mismo conjunto admFoliosDigitales con otro alias, y conectas la columna con el guid auxiliar del primer conjunto, con la columna principal del segundo conjunto.

    Salida


    viernes, 23 de agosto de 2019 2:45
  • Hola Javi,
    Gracias por tu respuesta, pero no obtengo lo requerido, de hecho obtengo NULL, adjunto la imagen

    Haciendo pruebas con un folio en específico yo esperaría que la columna cfolio trajera el dato 149466 y en la columna cfechacanc obtener el dato 15-ago-2019 (que son los datos correspondientes al identificador UUID Relacionado terminación C2317)

    Alguna otra idea?.

    Saludos,
    Javier

    • Editado jparada viernes, 23 de agosto de 2019 17:00
    viernes, 23 de agosto de 2019 17:00
  • Hola jparada:

    Te da null porque has casteado a varchar el on de admFoliosDigitales y eso no es lo mismo que g.cuuid

    Si los campos son guid y de la imagen se extrae que las columnas son UNIQUEIDENTIFER, no se pueden convertir a Varchar y mucho menos a Varchar sin darle un límite.

    Porque cast a varchar no tiene espacio suficiente para almacenar un guid

    declare @guid1 uniqueidentifier
    set @guid1 = newid();
    select cast (@guid1 as varchar)

    Mens. 8170, Nivel 16, Estado 2, Línea 5
    Espacio de resultados insuficiente para convertir un valor uniqueidentifier a char.

    Aunque la solución planteada es buena, para darte una modificación correcta, necesito saber de que tipo y tamaño son las columnas.

    CREATE TABLE admDocumentos
    (cfolio         VARCHAR(100), 
     cfecha         DATETIME, 
     ciddocumento   VARCHAR(100), 
     ciddocumentode INT
    );
    CREATE TABLE admFoliosDigitales
    (cuuid      varchar(100), 
     ccadpedi   varchar(100), 
     ciddocto   VARCHAR(100), 
     cfechacanc DATETIME
    );
    GO
    INSERT INTO admDocumentos (cfolio, cfecha, CIDDOCUMENTO, ciddocumentode)
    values
    ('100','20190101','1a',4),
    ('100','20190102','2a',4);
    go
    
    insert into admFoliosDigitales (cuuid, ccadpedi, ciddocto, cfechacanc)
    VALUES
    ('028F1B2A-6093-40EB-AD92-A973568A74CA', null, '1a','20190303'),
    (cast(newid() as varchar(100)), '028F1B2A-6093-40EB-AD92-A973568A74CA','1a',null),
    (cast(newid() as varchar(100)), null, '2a', '20190104');
    go
    SELECT d.cfolio [Folio], 
           CAST(d.cfecha AS DATE) [Fecha Factura], 
           f.cuuid [UUID], 
           f.ccadpedi [UUID Relacionado], 
           g.cuuid, 
           g.ccadpedi, 
           g.ciddocto, 
           g.cfechacanc
    FROM admFoliosDigitales f
         LEFT JOIN admFoliosDigitales g ON f.ccadpedi = g.cuuid
         INNER JOIN admDocumentos d ON d.ciddocumento = f.ciddocto
    WHERE d.ciddocumentode = 4
          AND d.cfecha BETWEEN '20190101' AND '20190822';

    Esta es la misma solución, pero con varchar(100) para ambas columnas

    Salida


    sábado, 24 de agosto de 2019 6:48
  • Hola Javi,
    Utilicé CAST porque me daba error en la consulta, adjunto imagen del error.


    Adjunto también los tipos de datos de las columnas.

    Gracias por tu ayuda.

    Saludos,
    Javier

    • Editado jparada sábado, 24 de agosto de 2019 14:21
    sábado, 24 de agosto de 2019 14:20
  • Hola jparada:

    Lo hiciste casi bien, pero te falto igualar ambas condiciones.

    CREATE TABLE admDocumentos
    (cfolio         VARCHAR(100), 
     cfecha         DATETIME, 
     ciddocumento   VARCHAR(100), 
     ciddocumentode INT
    );
    CREATE TABLE admFoliosDigitales
    (cuuid      varchar(100), 
     ccadpedi   text NULL, 
     ciddocto   VARCHAR(60) NOT NULL, 
     cfechacanc DATETIME
    );
    GO
    INSERT INTO admDocumentos (cfolio, cfecha, CIDDOCUMENTO, ciddocumentode)
    values
    ('100','20190101','1a',4),
    ('100','20190102','2a',4);
    go
    
    insert into admFoliosDigitales (cuuid, ccadpedi, ciddocto, cfechacanc)
    VALUES
    ('028F1B2A-6093-40EB-AD92-A973568A74CA', null, '1a','20190303'),
    (cast(newid() as varchar(60)), '028F1B2A-6093-40EB-AD92-A973568A74CA','1a',null),
    (cast(newid() as varchar(60)), null, '2a', '20190104');
    go
    SELECT d.cfolio [Folio], 
           CAST(d.cfecha AS DATE) [Fecha Factura], 
           f.cuuid [UUID], 
           f.ccadpedi [UUID Relacionado], 
           g.cuuid, 
           g.ccadpedi, 
           g.ciddocto, 
           g.cfechacanc
    FROM admFoliosDigitales f
         LEFT JOIN admFoliosDigitales g ON CAST(f.ccadpedi AS VARCHAR(60)) = g.cuuid
         INNER JOIN admDocumentos d ON d.ciddocumento = f.ciddocto
    WHERE d.ciddocumentode = 4
          AND d.cfecha BETWEEN '20190101' AND '20190822';

    Los obsoletos campos text, se puede castear a varchar, pero no a un tamaño inespecífico, sino a un tamaño que permita el tamaño de los datos. Si observas, solo he añadido el tamaño de la columna.

    Ya comentas.

    • Marcado como respuesta jparada lunes, 26 de agosto de 2019 14:47
    sábado, 24 de agosto de 2019 15:44
  • Hola Javi,

    Funcionó perfecto asignando el tamaño específico, una pregunta más por favor, si necesito ya con estos datos obtenidos ir nuevamente a la tabla admDocumentos para obtener otros datos, por ejemplo, fecha emisión de esa factura, totales, agente, etc.?, siguiendo la lógica, es correcto hacer nuevamente JOIN a la tabla de ésta forma:

    INNER JOIN admDocumentos do ON do.ciddocumento = g.ciddocto

    Gracias por tu ayuda Javi.

    Saludos,
    Javier
    • Editado jparada sábado, 24 de agosto de 2019 17:14
    sábado, 24 de agosto de 2019 17:14
  • Si puedes ir otra vez.

    Pero INNER JOIN, implica que si tienen que existir los valores de igualdad, si el campo es null perderías el registro origen. Para no perderlo LEFT JOIN

    sábado, 24 de agosto de 2019 20:04
  • Hola Javi,
    Muchas gracias por tu ayuda!!!.

    Saludos,
    Javier
    • Editado jparada lunes, 26 de agosto de 2019 14:47
    lunes, 26 de agosto de 2019 14:47
  • De nada

    Un saludo

    lunes, 26 de agosto de 2019 14:50