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
Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top