Pergunta

Fundo:

Eu tenho essa consulta "com cumulativo" definido no 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 isso gera esta saída:

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 você já usou "com cumulativos" consultas em MySQL antes, você provavelmente pode inferir a estrutura da minha tabela de origem.

Pergunta:

Dada esta saída crua do MySQL, que é a maneira mais fácil de obter uma estrutura "árvore" como o seguinte?

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

Solução

mais fácil é fazê-lo em qualquer programa cliente que você está usando para receber e mostrar a saída do MySQL usuário - definitivamente não mais fácil de implementar a funcionalidade de camada de apresentação em a camada de dados -!) Então, nos diga o idioma & c está em seu programa cliente e podemos ser capazes de ajudar ...

Edit:. Dando uma solução do lado do cliente simples Python, a pedido do autor da questão originais

Com DB API do Python, os resultados de uma consulta DB pode ser mais simplesmente visto como uma lista de tuplas. Então aqui está uma função para formatar esses resultados conforme necessário:

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 é um dicionário para mapear o '__xx__' marcador especial na seqüência desejada na saída (estou deixou-preenchimento-lo adequadamente para os totais "intermediárias", então quando eu imprimir o "total" final, eu .strip() aqueles blanks fora). Também usá-lo para verificar se o caso especial em que ambas as duas primeiras colunas são o marcador (porque, nesse caso, o segundo necessidades de coluna para ser transformado em espaços em vez disso). Sinta-se livre para perguntar nos comentários para qualquer esclarecimento adicional de expressões idiomáticas Python e uso que possa ser necessário!

Aqui está a saída que eu vejo quando eu chamar esta função com os dados fornecidos (se transformou em uma lista de 7 tuplas de 3 cordas cada):

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

O espaço-alinhamento não é idêntico ao que eu vejo na questão (que é um pouco inconsistente em termos de quantos espaços devem ser onde), mas eu espero que seja perto o suficiente para o que você quer tornar mais fácil para você ajuste isto a suas necessidades exatas (como você está tendo que traduzir Python em PHP de qualquer maneira, o espaço de ajuste deve esperamos ser o de menos).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top