Frage

Hintergrund:

Ich habe diese "mit Rollup" Abfrage definierte 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        

Und es erzeugt diese Ausgabe:

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

Wenn Sie sich vor „mit Rollup“ Abfragen in MySQL verwendet haben, können Sie wahrscheinlich die Struktur meiner Quelltabelle entnehmen.

Frage:

Vor diesem Rohausgangssignal von MySQL, was der einfachste Weg ist es, eine „Baum“ Struktur wie folgt zu bekommen?

AAPL
    hardware;$279,296
    software;$293,620
        Total; $572,916
MSFT
    hardware;$306,045
    software;$308,097
        Total;$614,142
Total    
            $1,187,058
War es hilfreich?

Lösung

Easiest ist, es zu tun, was auch immer in Client-Programm, das Sie den Benutzer MySQL Ausgabe zu erhalten und zeigen verwenden - auf jeden Fall nicht einfachste Präsentation-Layer-Funktionalität zu implementieren, in die Datenschicht -!) So sagen uns, welche Sprache & c in Ihrem Client-Programm ist und wir können ... Lage zu helfen,

Edit:. Eine einfache Python clientseitige Lösung auf den ursprünglichen Fragesteller Wunsch geben

Mit Python DB API, ergibt sich aus einer DB-Abfrage sich am einfachsten als eine Liste von Tupeln gesehen. Also hier ist eine Funktion um diese Ergebnisse zu formatieren, bei Bedarf:

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 ist ein Wörterbuch, um den speziellen Marker '__xx__' in die gewünschten Zeichenfolge in der Ausgabe (ich bin links-padding es passend für die „mittleren“ Summen auf der Karte, so dass, wenn ich die letzten „grand total“ zu drucken, ich .strip() diejenigen Zuschnitte aus). Ich benutze es auch für den Sonderfall zu prüfen, in dem sowohl der ersten beiden Spalten sind die Marker (weil in diesem Fall die zweite Spalte statt gedreht werden in die Räume benötigt). Fühlen Sie sich frei in den Kommentaren für jede weitere Klärung von Python Idiome und Verwendung zu stellen, die notwendig sein kann!

Hier ist der Ausgang ich sehe, wenn ich diese Funktion mit den gelieferten Daten aufrufen (verwandelte sich in eine Liste von 7 Tupel von 3 Strings jeweils):

AAPL
    hardware;$279,296
    software;$293,620
       Total;$572,916
MSFT
    hardware;$306,045
    software;$308,097
       Total;$614,142
Total
            ;$1,187,058

Die Raum-Ausrichtung ist nicht identisch mit dem ich in der Frage zu sehen (was in Bezug darauf, wie viele Räume sollen ein wenig inkonsistent sein, wo), aber ich hoffe, dass es in der Nähe ist genug, um was es Sie leicht machen wollen für Sie dies exakt auf Ihre Bedürfnisse anzupassen (wie Sie mit sowieso Python in PHP zu übersetzen, die Raum-Einstellung hoffentlich die wenigsten es sein sollte).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top