MySQL “con el paquete de continuación de” consulta se transformó en una estructura de árbol

StackOverflow https://stackoverflow.com/questions/923999

Pregunta

Antecedentes:

Tengo esta consulta "con el paquete de continuación" se define en 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        

Y genera esta salida:

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 ha utilizado "con el paquete acumulativo de" consultas en MySQL antes, se puede inferir más probable es que la estructura de mi tabla de origen.

Pregunta:

Teniendo en cuenta esta salida prima de MySQL, ¿cuál es la forma más fácil de obtener una estructura de "árbol" como el siguiente?

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

Solución

más fácil es hacerlo en cualquier programa cliente que está utilizando para recibir y mostrar la salida al usuario de MySQL - definitivamente no más fácil de implementar la funcionalidad de presentación en capas la capa de datos -!) Así que nos diga qué idioma y c es en su programa cliente y que puede ser capaz de ayudar ...

Editar:. Dando una solución del lado del cliente Python sencilla a petición del autor de la pregunta original,

Con la API de base de datos de Python, los resultados de una consulta de base de datos puede ser más simple vista como una lista de tuplas. Así que aquí hay una función para dar formato a los resultados que desee:

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 es un diccionario para mapear la '__xx__' marcador especial en la cadena deseada en la salida (soy-izquierda relleno de manera apropiada para los totales "intermedias", por lo que al imprimir la final "total", que los .strip() piezas de partida apagado). También lo uso para comprobar para el caso especial en el que ambas de las dos primeras columnas son el marcador (porque en ese caso la segunda columna tiene que ser convertido en espacios en lugar). No dude en preguntar en los comentarios para cualquier aclaración adicional de los idiomas de Python y el uso que pueda ser necesario!

Aquí está la salida que veo cuando llamo a esta función con los datos suministrados (convertidos en una lista de tuplas de 7 cuerdas 3 cada uno):

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

El espacio-alineación no es idéntica a la que veo en la cuestión (que es un poco inconsistente en términos de cuántos espacios se supone que es dónde), pero espero que sea lo suficientemente cerca de lo que se quiere hacer más fácil para ajustar esto a sus necesidades exactas (ya que estás tener que traducir en Python PHP de todos modos, el espacio-ajuste se espera que sea lo de menos).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top