Autor Tema: INNER JOIN  (Leído 27733 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado CALVINAHOBBES

  • Novato
  • *
  • Mensajes: 4
    • Ver Perfil
INNER JOIN
« en: 22 de Octubre de 2007, 09:51:34 pm »
DE ANTEMANO GRACIAS LAURA POR TU INDICACIÓN DE " ' "

QUIERO RELACIONAR VARIAS TABLAS, INTENTO UTILIZAR SELECT INNER JOIN PERO LOS MANUALES QUE TENGO NO SON MUY CLAROS Y GENERO MUCHOS ERRORES DE SINTAXIS,  SI ALGUNO ME PUEDE AYUDAR CON EJEMPLOS ESTARIA MUY BIEN. ???




Desconectado Nuria

  • Usuario Completo
  • ***
  • Mensajes: 90
    • Ver Perfil
Re: INNER JOIN
« Respuesta #1 en: 23 de Octubre de 2007, 11:00:02 am »
Hola, aquí te dejo un INNER JOIN sencillo de cabecera y posición con las tablas LIKP y LIPS.

Código: [Seleccionar]
  SELECT lips~vtweg lips~prodh lips~lfimg lips~brgew lips~ntgew
         lips~volum likp~vkorg likp~vkbur likp~bzirk likp~vstel
         likp~vbeln likp~lfart likp~kunnr likp~kunag likp~ernam
         likp~inco1 likp~sdabw likp~erdat likp~lfdat likp~wadat_ist
         likp~podat lips~posnr lips~matnr lips~vrkme lips~gewei
         lips~voleh lips~handle lips~meins
  INTO (lips-vtweg , lips-prodh , lips-lfimg , lips-brgew , lips-ntgew ,
        lips-volum , likp-vkorg , likp-vkbur , likp-bzirk , likp-vstel ,
        likp-vbeln , likp-lfart , likp-kunnr , likp-kunag , likp-ernam ,
        likp-inco1 , likp-sdabw , likp-erdat , likp-lfdat ,
        likp-wadat_ist , likp-podat , lips-posnr , lips-matnr ,
        lips-vrkme , lips-gewei , lips-voleh , lips-handle , lips-meins)
  FROM likp INNER JOIN lips ON likp~vbeln = lips~vbeln
  WHERE likp~vkorg IN p_vkorg AND
        likp~vkbur IN p_vkbur AND
        likp~bzirk IN p_bzirk AND
        likp~vstel IN p_vstel AND
        likp~vbeln IN p_vbeln AND
        likp~lfart IN p_lfart AND
        likp~kunnr IN p_kunnr AND
        likp~kunag IN p_kunag AND
        lips~matnr IN p_matnr AND
        likp~erdat IN p_erdat AND
        likp~lfdat IN p_lfdat AND
        likp~wadat_ist IN p_wadat AND
        likp~podat IN p_podat.

    MOVE lips-vtweg TO itab-vtweg.
    MOVE lips-prodh(2) TO itab-prodh1.
    MOVE lips-prodh(5) TO itab-prodh2.
    MOVE lips-prodh(7) TO itab-prodh3.
    MOVE lips-prodh TO itab-prodh.
    MOVE lips-brgew TO itab-brgew.
    MOVE lips-ntgew TO itab-ntgew.
    MOVE lips-volum TO itab-volum.
    MOVE likp-vkorg TO itab-vkorg.
    MOVE likp-vkbur TO itab-vkbur.
    MOVE likp-bzirk TO itab-bzirk.
    MOVE likp-vstel TO itab-vstel.
    MOVE likp-vbeln TO itab-vbeln.
    MOVE likp-lfart TO itab-lfart.
    MOVE likp-kunnr TO itab-kunnr.
    MOVE likp-kunag TO itab-kunag.
    MOVE likp-ernam TO itab-ernam.
    MOVE likp-inco1 TO itab-inco1.
    MOVE likp-sdabw TO itab-sdabw.
    MOVE likp-erdat TO itab-erdat.
    MOVE likp-lfdat TO itab-lfdat.
    MOVE likp-wadat_ist TO itab-wadat_ist.
    MOVE likp-podat TO itab-podat.
    MOVE lips-posnr TO itab-posnr.
    MOVE lips-matnr TO itab-matnr.
    MOVE lips-vrkme TO itab-vrkme.
    MOVE lips-voleh TO itab-voleh.
    MOVE lips-gewei TO itab-gewei.
    MOVE lips-handle TO itab-handle.
    MOVE lips-meins TO itab-meins.

Desconectado CALVINAHOBBES

  • Novato
  • *
  • Mensajes: 4
    • Ver Perfil
Re: INNER JOIN
« Respuesta #2 en: 23 de Octubre de 2007, 12:13:38 pm »
Nuria Tu ejemplo me ha servido aunque  a la hora de colocar un count mi código genera problemas.

Esto es lo que debo hacer:

Se dispone de las siguientes tablas:
ZMEMPLEADO:    DNI, Nombre
ZMTRABAJO:    Empleado, id_Proyecto
ZMPROYECTO:   Id_proyecto, Nombre_proy,   Horas

Un empleado puede estar una o más asignaciones a proyectos y un proyecto puede tener  una o más asignaciones a empleados.
Se debe hacer un listado del DNI y nombre de cada empleado, junto con el número de proyectos que tiene asignado, siempre y cuando estos proyectos superen las 20horas.

Lo que hago es lo siguiente:
genero las tablas, las claves foraneas , introduzco datos etc.

codigo:

REPORT zempleado.

TABLES: zempleado,
            ztrabajo,
            zproyecto.


DATA: BEGIN OF zint OCCURS 0,

              nombre         LIKE zempleado-nombre,
              dni_empleado LIKE ztrabajo-dni_empleado,
              id_proyecto   LIKE ztrabajo-id_proyecto,
              horas           LIKE zproyecto,

END OF zint.


DATA: count TYPE i.

SELECT   zempleado~nombre
             ztrabajo~dni_empleado
*****             COUNT(ZTRABAJO-ID_PROYECTO) SURGE ERRORES *****

INTO CORRESPONDING FIELDS OF TABLE zint

FROM ztrabajo INNER JOIN zempleado
                         ON ztrabajo~dni_empleado = zempleado~dni_empleado
                    INNER JOIN zproyecto
                         ON ztrabajo~id_proyecto  = zproyecto~id_proyecto

WHERE zproyecto~horas > 20.

PERFORM write.

FORM write.
  LOOP AT zint.
       WRITE:  /3 zint-nombre, 12 zint-dni_empleado.
  ENDLOOP.
ENDFORM.

*************************************************

ESTE CODIGO ME LISTA LOS DNI Y NOMBRES DE EMPLEADOS CON PROYECTOS > 20 HORAS, SIN AGRUPARLOS.

PERO CUANDO INTENTO COLOCAR EL COUNT O UN GROUP BY EL CODIGO GENERA ERROR.
AYUDADME :(

Desconectado CALVINAHOBBES

  • Novato
  • *
  • Mensajes: 4
    • Ver Perfil
Re: INNER JOIN
« Respuesta #3 en: 24 de Octubre de 2007, 09:34:17 am »
BUENO LO HE RESUELTO PERO SIN PODR UTILIZAR TABLAS INTERNAS Y ESO ES LO QUE ME MOLESTA.

SOLUCION:


REPORT ZMENDRUZCO.

TABLES: ZTRABAJO,
            ZEMPLEADO,
            ZPROYECTO.

DATA: COUNT TYPE I.
DATA: DNI    LIKE ZTRABAJO-DNI_EMPLEADO,
         NAME  LIKE ZEMPLEADO-NOMBRE,
         ID      LIKE ZTRABAJO-ID_PROYECTO.

SELECT
      ZTRABAJO~DNI_EMPLEADO
      ZEMPLEADO~NOMBRE
      COUNT(*)
      INTO (DNI, NAME, COUNT)

      FROM ZTRABAJO
        JOIN ZPROYECTO ON ZTRABAJO~ID_PROYECTO = ZPROYECTO~ID_PROYECTO
        JOIN ZEMPLEADO ON ZTRABAJO~DNI_EMPLEADO = ZEMPLEADO~DNI_EMPLEADO

      WHERE
        ZPROYECTO~HORAS > 20

      GROUP BY ZTRABAJO~DNI_EMPLEADO ZEMPLEADO~NOMBRE.

      WRITE: / DNI, NAME, COUNT.

ENDSELECT.