MySQL „mit Rollup“ query verwandelte in einer Baumstruktur
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
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).