mysql « avec Rollup » requête morphed dans une structure arborescente
Question
Contexte:
J'ai cette requête "avec Rollup" défini dans 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
Et il génère cette sortie:
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
Si vous avez utilisé « avec » requêtes en rollup MySQL avant, vous pouvez plus déduire probablement la structure de ma table source.
Question:
Compte tenu de cette sortie brute de MySQL, quelle est la meilleure façon d'obtenir une structure « arbre » comme ce qui suit?
AAPL
hardware;$279,296
software;$293,620
Total; $572,916
MSFT
hardware;$306,045
software;$308,097
Total;$614,142
Total
$1,187,058
La solution
Easiest est de le faire dans tout programme client que vous utilisez pour recevoir et montrer à l'utilisateur la sortie de MySQL - certainement pas plus facile à mettre en œuvre une fonctionnalité de couche de présentation la couche de données -) Alors dites-nous quelle langue et c est dans votre programme client et nous pouvons être en mesure d'aider ...
Edit:. Donner une solution simple côté client Python à la demande du demandeur d'origine
Avec l'API DB Python, les résultats d'une requête DB peut être plus simplement vu comme une liste de tuples. Voici donc une fonction pour formater les résultats selon les besoins:
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
est un dictionnaire pour cartographier le '__xx__'
marqueur spécial dans la chaîne désirée dans la sortie (je suis en train de gauche rembourrage appropriée pour les totaux « intermédiaires », donc quand j'imprimer le « grand total » finale, je .strip()
les obture). Je l'utilise aussi pour vérifier le cas particulier dans lequel les deux les deux premières colonnes sont le marqueur (car dans ce cas, la deuxième colonne doit être transformé en espaces à la place). Ne hésitez pas à demander dans les commentaires pour toute clarification des idiomes Python et l'utilisation qui peut être nécessaire!
Voici la sortie que je vois quand j'appelle cette fonction avec les données fournies (transformées en une liste de 7 tuples de 3 chaînes chacun):
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'espace-alignement est pas identique à celle que je vois dans la question (qui est un peu contradictoire en termes de combien de places sont censés être là où), mais je l'espère, il est assez proche de ce que vous voulez le rendre facile pour vous de régler cela à vos besoins (comme vous avoir à traduire Python en PHP de toute façon, l'espace-ajustement devrait, espérons-le moins de celui-ci).