2010-08-25 16 views
6

tengo una tabla en mi base de datos con formato de esta manera:transformación de datos con SQL

customer old_code new_code 
C1   A   X 
C1   B   Y   
C2   C   Y 
C2   D   Z 

De modo que el par de claves del cliente y el mapa old_code a un new_code. Esto es grande como una forma de almacenar los datos, parece ups son muy rápidos, pero para el consumo humano los datos se visualizan mejor como esto:

 C1 C2 
X  A 
Y  B  C 
Z   D 

¿Hay una manera fácil de usar SQL para transformar los datos en el segunda vista? Obviamente, puede haber cualquier cantidad de clientes, aunque podría consultar el único conjunto antes. Actualmente tengo < 50000 registros y espero que sea la norma, pero me gustaría que las soluciones escalen hasta unos cientos de miles si es posible. Mi aplicación actualmente apunta a MySQL.

Respuesta

1

Una forma estándar sería:

SELECT CC.NEW_CODE, 
     MAX(CASE CUSTOMER WHEN 'C1' THEN OLD_CODE ELSE NULL END) C1, 
     MAX(CASE CUSTOMER WHEN 'C2' THEN OLD_CODE ELSE NULL END) C2 
FROM CUSTOMER_CODE CC 
GROUP BY CC.NEW_CODE 
ORDER BY CC.NEW_CODE 

Por supuesto, esto depende de algunos supuestos y que sería tener más información sobre la singularidad de las columnas. Probé esto en Oracle, donde normalmente harías DECODE; Creo que CASE debería funcionar para usted.

0

Puede usar algunas técnicas OLAP para hacerlo. Si sus tablas no son enormes, puede exportar sus datos a Excel y usar tablas dinámicas para reorganizar sus datos en el diseño que acaba de mencionar.

También hay una herramienta de código abierto llamada Pentaho que podría ayudar. Se ejecuta en Java.

+0

Gracias, estoy básicamente familiarizado con las ideas OLAP y Mondrian en particular (el motor OLAP Pentaho usa) pero no puedo evitar sentir que esto es una sobreestimación seria para este problema. Quiero formatear el resultado como HTML para que Excel esté al menos al principio. Irónicamente, el formato de salida que estoy buscando producir es en realidad el formato de la hoja de cálculo que actuó como entrada. – wobblycogs

0

Creo que deberás llamar a PROCEDURE desde SELECT DISTINCT new_code.... El procedimiento usaría INSERT declaraciones con subconsultas como C1=(SELECT old_code FROM firsttable WHERE customer='C1' AND new_code=code) donde code es el new_code pasado como un parámetro del SELECT DISTINCT.

Nunca he intentado esto antes, así que no estoy seguro de exactamente cómo o cómo funcionaría, pero aquí es donde comenzaría conceptualmente.

Cuestiones relacionadas