none
AYUDA EN UNA CONSULTA LA CUAL ME SELECCIONE 2 VISTAS RRS feed

  • Pregunta

  • Buen dia Expertos, estoy desarrollando en sql Server2012

    Tengo 2 vistas (ReporteProducto y ALMACEN_GENERAL_SUB) 

    en la vista ReporteProducto(diferentes tablas,  varios productos de diferentes clases unidos con un union all) y la vista ALMACEN_GENERAL_SUB es una vista donde estan las tablas igresos,egresos, para poder tener el stock , cant promedio,etc), las 2 vistas los pude unir con este codigo:

    SELECT  RP.GENERAL,RP.CODIGO_ANTIGUO,RP.CODIGO,RP.DESCRIPCION,ASUB.STOCK,ASUB.COSTO_FINAL,ASUB.COSTO_TOTAL FROM REPORTEPRODUCTO RP
    INNER JOIN ALMACEN_GENERAL_SUB ASUB ON ASUB.GENERAL = RP.GENERAL

    Aunque cuando ingreso un nuevo producto en alguna de las tablas de los productos, que tengo en la vista "REPORTEPRODUCTO " si se visualiza, pero en este "SELECT" que estoy realizando no se puede visualizar, se que a mi parecer es porque lo estoy relacionando con un inner join con LA VISTA  "ALMACEN_GENERAL_SUB" ... porque cuando recien establezco un ingreso de cantidad,precio,etc del producto (que es una tabla que esta en la vista "ALMACEN_GENERAL_SUB"),  recién aparece en el "SELECT" que estoy desarrolando, las 2 vistas estan relacionadas con una columna llamada general que contienen el mismo código,...

    Alguien me podria ayudar en este problema o talvez me pueda dar una sugerencia gracias y disculpen si no me pude dejar entender bien.

    lunes, 28 de enero de 2019 19:57

Respuestas

  • Hola mario gr:

    Puedes probar con left join

    Ejemplo:

    CREATE TABLE REPORTEPRODUCTO (GENERAL INT, CODIGO_ANTIGUO INT, CODIGO INT, DESCRIPCION VARCHAR(100))
    CREATE TABLE ALMACEN_GENERAL_SUB (STOCK INT, COSTO_FINAL INT, COSTO_TOTAL INT, GENERAL INT)
    GO
    INSERT INTO REPORTEPRODUCTO (GENERAL, CODIGO_ANTIGUO, CODIGO, DESCRIPCION)
    VALUES
    (1,1,1,'A');
    GO
    /* fin del escenario. No es importante ni los tipos de datos,
    ni tan siquiera que sean vistas y no tablas, porque si observas el mismo, no inserto registros en almacen_general_sub */
    
    
    SELECT RP.GENERAL, 
           RP.CODIGO_ANTIGUO, 
           RP.CODIGO, 
           RP.DESCRIPCION, 
           ASUB.STOCK, 
           ASUB.COSTO_FINAL, 
           ASUB.COSTO_TOTAL
    FROM REPORTEPRODUCTO RP
         LEFT JOIN ALMACEN_GENERAL_SUB ASUB ON ASUB.GENERAL = RP.GENERAL;

    Si observas la salida, como la relación por parte de almacen_Genera_sub no se cumple, left join te devuelve para esos valores, null.

    Espero haberte entendido.

    • Marcado como respuesta mario gr lunes, 28 de enero de 2019 20:20
    lunes, 28 de enero de 2019 20:14

Todas las respuestas

  • Hola mario gr:

    Puedes probar con left join

    Ejemplo:

    CREATE TABLE REPORTEPRODUCTO (GENERAL INT, CODIGO_ANTIGUO INT, CODIGO INT, DESCRIPCION VARCHAR(100))
    CREATE TABLE ALMACEN_GENERAL_SUB (STOCK INT, COSTO_FINAL INT, COSTO_TOTAL INT, GENERAL INT)
    GO
    INSERT INTO REPORTEPRODUCTO (GENERAL, CODIGO_ANTIGUO, CODIGO, DESCRIPCION)
    VALUES
    (1,1,1,'A');
    GO
    /* fin del escenario. No es importante ni los tipos de datos,
    ni tan siquiera que sean vistas y no tablas, porque si observas el mismo, no inserto registros en almacen_general_sub */
    
    
    SELECT RP.GENERAL, 
           RP.CODIGO_ANTIGUO, 
           RP.CODIGO, 
           RP.DESCRIPCION, 
           ASUB.STOCK, 
           ASUB.COSTO_FINAL, 
           ASUB.COSTO_TOTAL
    FROM REPORTEPRODUCTO RP
         LEFT JOIN ALMACEN_GENERAL_SUB ASUB ON ASUB.GENERAL = RP.GENERAL;

    Si observas la salida, como la relación por parte de almacen_Genera_sub no se cumple, left join te devuelve para esos valores, null.

    Espero haberte entendido.

    • Marcado como respuesta mario gr lunes, 28 de enero de 2019 20:20
    lunes, 28 de enero de 2019 20:14
  • Grande Javi Fernández F muchas gracias, aunque sale null, en esas tres filas(STOCK,COSTO_FINAL,COSTO_TOTAL) del ALMACEN_GENERAL_SUB, ME SALEN NULL, PIENSO APLICARLE  

    NULLIF(ISNULL((STOCK), 0), 0)

    lunes, 28 de enero de 2019 20:25
  • Javi Fernández F , ME SALIO DE ESTA FORMA ME DICES SI ES LA MEJOR MANERA TODO LOS NULL ME SALIAN 0.00 .... GRACIAS POR LA AYUDA NUEVAMENTE...

    SELECT  RP.GENERAL,RP.CODIGO_ANTIGUO,RP.CODIGO,RP.DESCRIPCION,
    ISNULL(NULLIF((ASUB.STOCK), 0), 0) AS STOCK,
    ISNULL(NULLIF((ASUB.COSTO_FINAL), 0), 0) AS COSTO_FINAL,
    ISNULL(NULLIF((ASUB.COSTO_TOTAL), 0), 0) AS COSTO_TOTAL
    FROM REPORTEPRODUCTO RP
    LEFT JOIN ALMACEN_GENERAL_SUB ASUB ON ASUB.GENERAL = RP.GENERAL

    lunes, 28 de enero de 2019 20:30
  • De nada mario gr,

    No obstante si tu intención es poner un 0 donde hay un null, solo tienes que hacer isnull(stock,0). Ya que si tu intención es, por lo que leo, nulliff (parametro 1 = 0)

    donde parametro 1= isnull(stock,0). Por tanto si stock es null con nullif, el resultado será null.

    Si el resultado es null, pues para que aplicarle dos funciones ¿no?

    lunes, 28 de enero de 2019 20:35
  • Gracias Javi Fernández F quedo perfecto gracias.
    lunes, 28 de enero de 2019 20:48