Tengo dos mesas:

Tabla 1:

+-----------+-----------+------------------+
| ID        | Value     | other            |
+-----------+-----------+------------------+
| 123456    | 5         | 12               |
| 987654    | 7         | 15               |
| 456789    | 6         | 22               |
+-----------+-----------+------------------+

Tabla 2:

+-----------+-----------+------------------+
| ID        | Type      | other            |
+-----------+-----------+------------------+
| 123456    | 00        | 2                |
| 123456    | 01        | 6                |
| 123456    | 02        | 4                |
| 987654    | 00        | 7                |
| 987654    | 01        | 8                |
| 456789    | 00        | 6                |
| 456789    | 01        | 16               |
+-----------+-----------+------------------+

Ahora realizo la unión interna:

SELECT
  table1.ID, table2.TYPE, table1.value, table2.other 
FROM
  table1 INNER JOIN table2 ON table1.ID = table2.ID

Aquí la SQLfiddle

Tabla de resultados:

+-----------+-----------+---------+------------------+
| ID        | Type      | Value   | other            |
+-----------+-----------+---------+------------------+
| 123456    | 00        | 5       | 2                |
| 123456    | 01        | 5       | 6                |
| 123456    | 02        | 5       | 4                |
| 987654    | 00        | 7       | 7                |
| 987654    | 01        | 7       | 8                |
| 456789    | 00        | 6       | 6                |
| 456789    | 01        | 6       | 16               |
+-----------+-----------+---------+------------------+

Esto es totalmente lo que esperaba pero no lo que necesito. Porque si ahora quiero obtener el Valor por ID, el Valor se duplica o triplica por la primera causa.

Tabla deseada:

+-----------+-----------+---------+------------------+
| ID        | Type      | Value   | other            |
+-----------+-----------+---------+------------------+
| 123456    | 00        | 5       | 2                |
| 123456    | 01        | -       | 6                |
| 123456    | 02        | -       | 4                |
| 987654    | 00        | 7       | 7                |
| 987654    | 01        | -       | 8                |
| 456789    | 00        | 6       | 6                |
| 456789    | 01        | -       | 16               |
+-----------+-----------+---------+------------------+

Traté de lograr una salida similar contando las filas por id y dividiendo la suma de Valor por esa cuenta, pero no pareció funcionar y no es la salida deseada.

Además, intenté agrupar pero esto no pareció lograr el resultado deseado.

Una cosa para mencionar es que la base de datos con la que estoy trabajando es una base de datos ORACLE SQL.

1
M.Wagner 22 ene. 2018 a las 13:11

3 respuestas

La mejor respuesta

¿Qué tal esto:

select table1.id
     , table2.type
     , case
           when row_number() over (partition by table1.id order by table2.type) = 1
           then table1.value
       end as "VALUE"
     , table2.other
from   table1
       join table2 on table1.id = table2.id
order by 1, 2;

(Esta es la sintaxis de Oracle SQL. Su Fiddle de SQL (¡gracias!) Se configuró en MySQL, que hasta donde sé no tiene funciones analíticas como row_number().)

1
William Robertson 22 ene. 2018 a las 10:52

Puede usar un bloque CASE para mostrar NULL para el cual NO es igual al valor MIN de type

SELECT table1.ID,
       table2.TYPE,
       CASE
          WHEN table2.TYPE =
                  MIN (table2.TYPE)
                     OVER (PARTITION BY table1.id ORDER BY table2.TYPE)
          THEN
             Table1.VALUE
       END
          VALUE,
       table2.other
  FROM table1 INNER JOIN table2 ON table1.ID = table2.ID;
0
Kaushik Nayak 22 ene. 2018 a las 10:59

Una forma de obtener el resultado.

  select   t1.ID,
           t2.type, 
           t1.value,
           t2.other
    from table1 t1 inner join table2 t2
    ON t1.ID = t2.ID
    inner join (select ID, min(type) mv
    from table2
    group by id) m
    on t2.id = m.id
    and t2.type = m.mv
    union all
    select t1.ID,
           t2type, 
           null,
           t2.other
    from table1 t1 inner join table2 t2
    ON t1.ID = t2.ID
    and not exists (
    select 1 from (
    select ID, min(type) mv
    from table2
    group by id) m
    where t2.id = m.id
    and t2.type = m.mv
    )

    order by id,type
0
Jerome 22 ene. 2018 a las 10:51