سؤال

خلفية:

لدي هذا "مع استعلام" الترجمة "المعرفة في 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        

ويولد هذا الإخراج:

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

إذا كنت قد استخدمت استعلامات "مع الترجمة" في MySQL من قبل، فيمكنك أن تستغل بنية الجدول المصدر الخاص بي.

سؤال:

بالنظر إلى هذا الناتج الخام من MySQL، ما هي أسهل طريقة للحصول على هيكل "شجرة" مثل ما يلي؟

AAPL
    hardware;$279,296
    software;$293,620
        Total; $572,916
MSFT
    hardware;$306,045
    software;$308,097
        Total;$614,142
Total    
            $1,187,058
هل كانت مفيدة؟

المحلول

أسهل هو القيام بذلك في أي برنامج العميل الذي تستخدمه لتلقي وإظهار إخراج المستخدم MySQL - بالتأكيد ليس أسهل لتنفيذ وظائف طبقة العرض التقديمي في طبقة البيانات! - أخبرنا اللغة & C في برنامج العميل الخاص بك وقد نتمكن من المساعدة ...

تحرير: إعطاء حل بايتون بايتون بسيطة في طلب Asker الأصلي.

مع Python's DB API، يمكن أن ينظر إلى النتائج من استعلام DB ببساطة كقائمة من tuples. إذن إليك وظيفة لتنسيق تلك النتائج كما هو مطلوب:

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 هو القاموس لتعيين علامة خاصة '__xx__' في السلسلة المرغوبة في الإخراج (أنا طابقي الحشد بشكل مناسب عن المجاميع "المتوسطة"، لذلك عندما أطبع "الكلي الكلي" النهائي، أنا .strip() تلك الفراغات قبالة). أنا أيضا استخدامها للتحقق من الحالة الخاصة التي يكون فيها كل من الأعمدة الأولىين العلامة (لأنه في هذه الحالة يحتاج العمود الثاني إلى تحويل إلى مسافات بدلا من ذلك). لا تتردد في طرحه في تعليقات لأي توضيح إضافي لأعابير بيثون واستخدام قد يكون ضروريا!

إليك الناتج الذي أراه عند استدعاء هذه الوظيفة مع البيانات المرفقة (تحولت إلى قائمة من 7 مكيفات من 3 سلاسل لكل منها):

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

لا تكون محاذاة الفضاء متطابقة لذلك أرى في السؤال (وهو أمر غير متسابق قليلا من حيث عدد المساحات التي من المفترض أن تكون فيها العديد من المساحات) ولكن آمل أن تكون قريبا بما يكفي لما تريد أن تجعله من السهل عليك ضبطه هذا لاحتياجاتك الدقيقة (كما تواجهك لترجمة ثعبان إلى PHP على أي حال، يجب أن يكون تعديل المساحة أقل منهما).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top