es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Transponer filas a columnas utilizando múltiples pivotes.

Estoy tratando de transponer filas a columnas sin éxito. Esto es lo que tengo ahora:

WEEK_NUMBER VAL9 VAL4 VAL5 VAL7
45 63.27% 28.58% 7.92% 0.23%
52 65.66% 26.16% 7.80% 0.38%
50 90.97% 8.45% 0.29% 0.29%
46 82.49% 12.43% 3.01% 2.06%
47 66.33% 29.53% 3.77% 0.36%
51 65.36% 31.83% 2.69% 0.11%
49 61.88% 28.29% 9.46% 0.37%
44 45.34% 45.55% 8.45% 0.66%
48 43.75% 40.01% 16.01% 0.23%

Esto está basado en la siguiente consulta:

select 
     to_char(for_date,'ww') as week_number
    ,val9
    ,val4
    ,val5
    ,val7
from data_tab
where to_char(for_date,'yy') = '21'

Estoy tratando de obtener el siguiente resultado:

01 02 .. 51 52
VAL9 0 0 .. 65.36% 65.66%
VAL4 0 0 .. 31.83% 26.16%
VAL5 0 0 .. 2.69% 7.80%
VAL7 0 0 .. 0.11% 0.38%

He intentado con la siguiente consulta, pero no he tenido éxito. Si alguien puede indicarme en la dirección correcta, lo agradecería.

select * from (
select 
         to_char(for_date,'ww') as week_number
        ,val9
        ,val4
        ,val5
        ,val7
    from data_tab
    where to_char(for_date,'yy') = '21')
pivot (
    min(val9)--, min(val4), min(val5), min(val7) 
        for week_number in (01 ,02 ,03 ,04 ,05 ,06 ,07 ,08 ,09 ,10 ,11 ,12 ,13 ,14 ,15 ,16 ,17 ,18 ,19 ,20 ,21 ,22 ,23 ,24 ,25 ,26 ,27 ,28 ,29 ,30 ,31 ,32 ,33 ,34 ,35 ,36 ,37 ,38 ,39 ,40 ,41 ,42 ,43 ,44 ,45 ,46 ,47 ,48 ,49 ,50 ,51 ,52 ,53)  
)
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que estás en el camino correcto utilizando una función de pivote. Sin embargo, parece que has especificado demasiadas columnas en la cláusula de pivote. En lugar de especificar todos los posibles números de semana, puedes usar SQL dinámico para generar la lista de columnas basada en los valores en la columna WEEK_NUMBER de tus datos fuente.

    Aquí tienes una consulta de ejemplo que debería darte el resultado deseado:

    CON pivot_data AS (
      SELECT
        'VAL9' AS nombre_val,
        to_char(for_date, 'ww') AS numero_semana,
        val9 AS valor
      FROM data_tab
      WHERE to_char(for_date, 'yy') = '21'
      UNION ALL
      SELECT
        'VAL4' AS nombre_val,
        to_char(for_date, 'ww') AS numero_semana,
        val4 AS valor
      FROM data_tab
      WHERE to_char(for_date, 'yy') = '21'
      UNION ALL
      SELECT
        'VAL5' AS nombre_val,
        to_char(for_date, 'ww') AS numero_semana,
        val5 AS valor
      FROM data_tab
      WHERE to_char(for_date, 'yy') = '21'
      UNION ALL
      SELECT
        'VAL7' AS nombre_val,
        to_char(for_date, 'ww') AS numero_semana,
        val7 AS valor
      FROM data_tab
      WHERE to_char(for_date, 'yy') = '21'
    )
    SELECT
      nombre_val,
      PIVOT.*
    FROM pivot_data
    PIVOT (
      MAX(valor)
      FOR numero_semana IN (
        SELECT DISTINCT to_char(for_date, 'ww')
        FROM data_tab
        WHERE to_char(for_date, 'yy') = '21'
        ORDER BY to_char(for_date, 'ww')
      )
    ) PIVOT;
    

    Esta consulta utiliza una expresión de tabla común (CTE) para despivotar las columnas VAL9, VAL4, VAL5 y VAL7 en una tabla “pivot_data” que tiene tres columnas: “nombre_val”, “numero_semana” y “valor”. La CTE filtra las filas para incluir solo los datos del año 2021.

    Luego, la consulta principal realiza una operación de pivote en la tabla “pivot_data” utilizando la función MAX para agregar la columna “valor”. La operación de pivote genera dinámicamente la lista de números de semana basados en los valores distintos en la columna “numero_semana” de la tabla “data_tab”. Los resultados se ordenan por número de semana.

    Finalmente, la consulta selecciona la columna “nombre_val” junto con las columnas generadas dinámicamente a partir de la operación de pivote.

    Esto debería darte una tabla de resultados que se ve así:

    +-----------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
    | NOMBRE_VAL|  01   |  02   |  45   |  46   |  47   |  48   |  49   |  50   |  51   |  52   |
    +-----------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
    |   VAL9    | 63.27 |   0   | 63.27 | 82.49 | 66.33 | 43.75 | 61.88 | 90.97 | 65.36 | 65.66 |
    |   VAL4    | 28.58 |   0   | 28.58 | 12.43 | 29.53 | 40.01 | 28.29 | 8.45  | 31.83 | 26.16 |
    |   VAL5    |  7.92 |   0   |  7.92 |  3.01 |  3.77 | 16.01 |  9.46 |  0.29 |  2.69 |  7.80 |
    |   VAL7    |  0.23 |   0   |  0.23 |  2.06 |  0.36 |  0.23 |  0.37 |  0.29 |  0.11 |  0.38 |
    +-----------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
    

Comments are closed.