2010-08-25 20 views
6

Ho una tabella nel mio database formattato in questo modo:trasformazione dei dati con SQL

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

Così la coppia di chiavi del cliente e mappa old_code ad un new_code. Questo è grande come un modo di memorizzare i dati, sembra up sono molto veloci, ma per il consumo umano i dati sarebbero meglio visualizzati in questo modo:

 C1 C2 
X  A 
Y  B  C 
Z   D 

C'è un modo semplice utilizzando SQL per trasformare i dati al seconda visione? Ovviamente ci può essere un numero qualsiasi di clienti anche se potrei richiedere il set unico in anticipo. Attualmente ho < record di 50000 e mi aspetto che sia la norma, ma mi piacerebbe che ogni soluzione salisse fino a poche centinaia di migliaia se possibile. La mia applicazione attualmente si rivolge a MySQL.

risposta

1

Un modo standard sarebbe:

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 

Naturalmente, questo dipende da alcune ipotesi e si dovrebbe avere più informazioni sulla unicità delle colonne. Ho provato questo in Oracle, dove di solito facevi DECODE; Penso che CASE dovrebbe funzionare per te.

0

È possibile utilizzare alcune tecniche OLAP per farlo. Se le tabelle non sono enormi, puoi esportare i dati in Excel e utilizzare le tabelle pivot per riorganizzare i dati nel layout appena menzionato.

C'è anche uno strumento open source chiamato Pentaho che potrebbe essere d'aiuto. Funziona su Java.

+0

Grazie, ho praticamente familiarità con le idee OLAP e Mondrian in particolare (il motore OLAP utilizzato da Pentaho) ma non posso fare a meno di pensare che si tratta di un serio over-kill per questo problema. Voglio formattare l'output in formato HTML così Excel è uscito almeno inizialmente. Ironia della sorte, il formato di output che sto cercando di produrre è in realtà il formato del foglio di calcolo che ha funto da input! – wobblycogs

0

Penso che potrebbe essere necessario chiamare uno PROCEDURE all'interno di un SELECT DISTINCT new_code.... La procedura utilizza le istruzioni INSERT con sottoquery come C1=(SELECT old_code FROM firsttable WHERE customer='C1' AND new_code=code) dove code è il nuovo codice passato come parametro dallo SELECT DISTINCT.

Non l'ho mai provato prima, quindi non sono sicuro esattamente se o come funzionerebbe, ma è qui che vorrei iniziare concettualmente.

Problemi correlati