"toplaması ile" mysql

1 Cevap php

Background:

Ben MySQL tanımlanan bu "toplaması ile" sorgusu vardır:

    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

Ve bu çıktıyı üretir:

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

Daha önce MySQL "ile toplaması" sorguları kullandıysanız, büyük olasılıkla benim kaynak tablonun yapısını çıkarabiliriz.

Question:

MySQL bu ham çıkışı göz önüne alındığında, aşağıdaki gibi bir "ağaç" yapısı elde etmek için en kolay yolu nedir?

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

1 Cevap

Kesinlikle not kolay veri katmanı sunum katmanı işlevselliğini uygulamak için - Easiest aldığınız ve kullanıcı MySQL'in çıkışını göstermek için kullandığınız ne olursa olsun istemci programı bunu yapmak için! - ) Peki dil & c istemci programı ve biz yardımcı olmak için mümkün olabilir bize söyle ...

Edit: Orijinal Asker'in isteği basit bir Python istemci tarafı çözümü verir.

Python DB API ile, DB sorgudan sonuç en basit dizilerini bir liste olarak görülebilir. Yani burada gerektiği gibi bu sonuçları biçimlendirmek için bir fonksiyon:

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 (çıkışında istenen dizeye özel bir işaret '__xx__' haritasına bir sözlüktür Ben sol-dolgu ediyorum bu yüzden, "orta" toplamları için bunu uygun ben yazdırırken son "genel toplam", I .strip() bu boşluklar kapalı). (Bu durumda ikinci sütun yerine boşluk dönüştü gerekiyor çünkü) ben de ilk iki sütun her iki işaretleyici olduğu özel durum için kontrol etmek için kullanabilirsiniz. Python deyimler başka açıklama yorumlarda sormak ve bu gerekli olabilir kullanmak için çekinmeyin!

İşte (3 dizeleri her 7 dizilerini listesine dönüştü) sağlanan veri ile bu işlevini çağırdığınızda görüyorum çıkışı bulunuyor:

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

Uzay-hizalama Ben bunu kolay ayarlamak için yapmak istiyorum ne kadar yakın olduğunu umuyoruz ama (kaç alanlarda nerede olması gerekiyordu açısından biraz tutarsız) Söz gördüğünüz için aynı değildir ihtiyaçlarınızı tam bu (yine PHP içine Python çevirmek zorunda konum olarak, uzay-ayar umarım bunun en az olmalıdır).