transponer tabla pasar multiples filas ejemplo dinamico convertir columnas sql oracle oracle10g ora-00904

tabla - sql oracle convertir columnas en filas



Usando ''columna de expresión de caso'' en donde cláusula (6)

El motivo de este error es que las SELECT SQL SELECT se procesan lógicamente * en el siguiente orden:

  • FROM : selección de una tabla o muchas combinaciones y todas las combinaciones de filas que coincidan con las condiciones ON .

  • WHERE : se evalúan las condiciones y se eliminan las filas que no coinciden.

  • GROUP BY : las filas están agrupadas (y cada grupo se colapsa en una fila)

  • HAVING : las condiciones se evalúan y las filas que no coinciden se eliminan.

  • SELECT : se evalúa la lista de columnas.

  • DISTINCT : se eliminan las filas duplicadas (si se trata de una instrucción SELECT DISTINCT)

  • UNION , EXCEPT , INTERSECT : la acción de ese operando se toma sobre las filas de las instrucciones sub-SELECT. Por ejemplo, si se trata de UNION, todas las filas se recopilan (y se eliminan los duplicados a menos que sea UNION TODO) después de que se evalúen todas las declaraciones sub-SELECT. En consecuencia, para los casos EXCEPT o INTERSECT.

  • ORDER BY : las filas están ordenadas.

Por lo tanto, no puede usar en la cláusula WHERE , algo que aún no se ha rellenado o calculado. Vea también esta pregunta: oráculo-sql-cláusula-evaluación-orden

* procesado lógicamente : tenga en cuenta que los motores de base de datos también pueden elegir otro orden de evaluación para una consulta (¡y eso es lo que suelen hacer!) La única restricción es que los resultados deberían ser los mismos que si se utilizara el orden anterior .

La solución es encerrar la consulta en otra :

SELECT * FROM ( SELECT ename , job , CASE deptno WHEN 10 THEN ''ACCOUNTS'' WHEN 20 THEN ''SALES'' ELSE ''UNKNOWN'' END AS department FROM emp ) tmp WHERE department = ''SALES'' ;

o para duplicar el cálculo en la condición WHERE :

SELECT ename , job , CASE deptno WHEN 10 THEN ''ACCOUNTS'' WHEN 20 THEN ''SALES'' ELSE ''UNKNOWN'' END AS department FROM emp WHERE CASE deptno WHEN 10 THEN ''ACCOUNTS'' WHEN 20 THEN ''SALES'' ELSE ''UNKNOWN'' END = ''SALES'' ;

Supongo que esta es una versión simplificada de su consulta o podría usar:

SELECT ename , job , ''SALES'' AS department FROM emp WHERE deptno = 20 ;

SELECT ename , job , CASE deptno WHEN 10 THEN ''ACCOUNTS'' WHEN 20 THEN ''SALES'' ELSE ''UNKNOWN'' END AS department FROM emp /* !!! */ WHERE department = ''SALES''

Esto falla:

ORA-00904: "% s: identificador no válido"

¿Hay alguna manera de superar esta limitación en Oracle 10.2 SQL? ¿Cómo usar la ''columna de expresión de caso'' en la cláusula where?


Este trabajo para mí:

SELECT ename, job FROM emp WHERE CASE WHEN deptno = 10 THEN ''ACCOUNTS'' WHEN deptno = 20 THEN ''SALES'' ELSE ''UNKNOWN'' END = ''SALES''


Oracle intenta filtrar la cantidad de registros que se van a escanear de la tabla yendo a la cláusula where primero, antes de seleccionar, es por eso que falla su consulta. Además, su consulta nunca habría devuelto filas con el departamento - "Cuentas o Desconocido" debido al filtro Departamento = "VENTAS"

Pruebe a continuación, que será fácil de obtener por Engine:

SELECCIONE ename, job, ''SALES'' COMO departamento FROM emp DONDE deptno = 20;


Su tabla no contiene un "departamento" de columna y, por lo tanto, no puede hacer referencia a ella en su cláusula where. Use deptno en su lugar.

SELECT ename , job , CASE deptno WHEN 10 THEN ''ACCOUNTS'' WHEN 20 THEN ''SALES'' ELSE ''UNKNOWN'' END AS department FROM emp /* !!! */ where deptno = 20;


tratar:

SQL> SELECT ename 2 , job 3 , CASE 4 WHEN deptno = 10 5 THEN ''ACCOUNTS'' 6 WHEN deptno = 20 7 THEN ''SALES'' 12 ELSE ''UNKNOWN'' 13 END AS department 14 FROM emp /* !!! */ where department = ''SALES'';


select emp_.* from (SELECT ename , job , CASE deptno WHEN 10 THEN ''ACCOUNTS'' WHEN 20 THEN ''SALES'' ELSE ''UNKNOWN'' END AS department FROM emp /* !!! */ ) emp_ where emp_.department=''UNKNOWN'';