MySQL запрос "с накоплением" превратился в древовидную структуру - PullRequest
0 голосов
/ 29 мая 2009

Справочная информация:

У меня есть этот запрос "с накопительным пакетом", определенный в 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

1 Ответ

2 голосов
/ 29 мая 2009

Самый простой - это сделать в любой клиентской программе, которую вы используете, чтобы получать и отображать вывод MySQL пользователя - определенно не проще всего реализовать функциональность уровня представления в данных слой! -) Так скажите нам, какой язык & c есть в вашей клиентской программе, и мы сможем помочь ...

Редактирование: предоставление простого клиентского решения Python по первоначальному запросу аскера.

С помощью API-интерфейса БД Python результаты запроса к БД можно проще всего рассматривать как список кортежей. Итак, вот функция для форматирования этих результатов по мере необходимости:

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() эти пропуски). Я также использую его для проверки особого случая, когда оба первых двух столбца являются маркером (потому что в этом случае второй столбец должен быть превращен в пробелы). Не стесняйтесь спрашивать в комментариях для любого дальнейшего разъяснения идиом Python и использования, которые могут быть необходимы!

Вот вывод, который я вижу, когда вызываю эту функцию с предоставленными данными (превращенными в список из 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

Выравнивание пространства не совпадает с тем, что я вижу в вопросе (что немного противоречиво с точки зрения того, сколько мест должно быть где), но я надеюсь, что оно достаточно близко к тому, что вы хотите, чтобы было легко чтобы настроить его в соответствии с вашими потребностями (так как вам все равно придется переводить Python на PHP, настройка пространства, надеюсь, должна быть наименьшей из этого).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...