0

背景:

我在 MySQL 中定义了这个“with rollup”查询:

    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 中使用过“with rollup”查询,您很可能可以推断出我的源表的结构。

问题:

鉴于 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
4

1 回答 1

2

最简单的方法是在您用来接收和显示用户 MySQL 输出的任何客户端程序中执行此操作——在数据层中实现表示层功能绝对不是最容易的!-) 所以告诉我们您的客户端程序中使用的是什么语言 &c我们也许可以提供帮助...

编辑:应原始提问者的要求提供简单的 Python 客户端解决方案。

使用 Python 的 DB API,来自 DB 查询的结果可以最简单地视为元组列表。因此,这是一个根据需要格式化这些结果的函数:

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,所以空间调整应该是最少的)。

于 2009-05-29T01:48:54.843 回答