mysql “con rollup” interrogazione trasformato in una struttura ad albero
Domanda
Sfondo:
Ho questa query "con il rollup" definito in MySQL:
SELECT
case TRIM(company)
when 'apple' THEN 'AAPL'
when 'microsoft' THEN 'MSFT'
else '__xx__'
END as company
,case TRIM(division)
when 'hardware' THEN Trim(division)
when 'software' THEN Trim(division)
else '__xx__'
END as division
,concat( '$' , format(sum(trydollar),0)) as dollars
FROM pivtest
GROUP BY
company, division with rollup
E genera questo output:
AAPL;hardware;$279,296 AAPL;software;$293,620 AAPL;__xx__;$572,916 MSFT;hardware;$306,045 MSFT;software;$308,097 MSFT;__xx__;$614,142 __xx__;__xx__;$1,187,058
Se si è utilizzato "con rollup" query in MySQL prima, si può probabilmente dedurre la struttura della mia tabella di origine.
Domanda:
Data questa uscita grezza di MySQL, qual è il modo più semplice per ottenere una struttura "ad albero" come la seguente?
AAPL
hardware;$279,296
software;$293,620
Total; $572,916
MSFT
hardware;$306,045
software;$308,097
Total;$614,142
Total
$1,187,058
Soluzione
più semplice è di farlo in qualsiasi programma client che si sta utilizzando per ricevere e visualizzare l'output l'utente di MySQL - sicuramente non più facile per implementare la funzionalità presentazione in strati lo strato di dati -!) Così ci dicono che lingua & c è nel vostro programma client e potremmo essere in grado di aiutare ...
Modifica:. Dando una soluzione client-side semplice Python su richiesta del richiedente originale
Con API DB di Python, i risultati di una query di database può essere più semplicemente visto come una lista di tuple. Quindi, ecco una funzione per formattare i risultati come richiesto:
def formout(results):
marker = dict(__xx__=' Total')
current_stock = None
for stock, kind, cash in results:
if stock != current_stock:
print marker.get(stock, stock).strip()
current_stock = stock
if kind in marker and stock in marker:
kind = ' '*8
print ' %s;%s' % (marker.get(kind, kind), cash)
marker
è un dizionario per mappare la speciale '__xx__'
marcatore nella stringa desiderata in uscita (io sono di sinistra-imbottitura in modo appropriato per i totali "intermedi", così quando stampo il finale "totale", ho .strip()
quelli Blanks off). Lo uso anche per verificare il caso particolare in cui entrambe le prime due colonne sono il marcatore (perché in tal caso la seconda colonna deve essere trasformato in spazi invece). Non esitate a chiedere nei commenti per ogni ulteriore chiarimento di idiomi Python e l'uso che può essere necessario!
Ecco l'output che vedo quando chiamo questa funzione con i dati forniti (trasformato in un elenco di 7 tuple di 3 stringhe ciascuno):
AAPL
hardware;$279,296
software;$293,620
Total;$572,916
MSFT
hardware;$306,045
software;$308,097
Total;$614,142
Total
;$1,187,058
Lo spazio-allineamento non è identico a quello che vedo nella questione (che è un po 'incoerente in termini di quanti spazi si suppone siano dove) ma spero che sia abbastanza vicino a quello che si vuole rendere più facile per di regolare questo per le vostre esigenze (come hai di tradurre Python in PHP in ogni caso, lo spazio-regolazione spera, dovrebbe essere il meno).