запрос mysql “со сверткой” преобразован в древовидную структуру
Вопрос
Предыстория:
У меня есть этот запрос "with rollup", определенный в 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
Если вы раньше использовали запросы "with rollup" в 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 используется в вашей клиентской программе, и, возможно, мы сможем помочь...
Редактировать:предоставление простого клиентского решения на Python по запросу исходного пользователя.
С помощью Python DB API результаты запроса к БД проще всего представить в виде списка кортежей.Итак, вот функция для форматирования этих результатов по мере необходимости:
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, корректировка пробела, надеюсь, должна быть наименьшей из них).