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
È stato utile?

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).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top