在Excel中创建逗号分隔的值(使用数据透视表)?

时间:2010-12-08 20:58:41

标签: excel pivot-table denormalization csv

有没有办法在Excel中生成逗号分隔的值(最佳使用数据透视表)?请考虑以下数据:

Object Color
foo    Red
foo    Blue
bar    Red
bar    Blue
bar    Green
baz    Yellow

我想得到如下表格:

Object  Count of Color  Colors
foo     2               Red,Blue
bar     3               Red,Blue,Green
baz     1               Yellow

这可以在Excel中使用吗?数据来自SQL查询,因此我可以编写一个带有递归CTE的UDF来计算,但这是针对单个ad-hoc查询,我想要一种快速而简单的方法来获取非规范化数据。最后,发布此文件可能比编写UDF要花费更长时间,但是......

2 个答案:

答案 0 :(得分:4)

这是一个更简单的答案,改编自this superuser answer(HT到@yioann用来指出它,@F106dart用于原作:

假设数据在列A(类别)和B(值)中:

  1. 创建一个新列(C),并将其命名为“Values”。使用此公式,从单元格C2开始并一直复制:=IF(A2=A1, C1&","&B2, B2)
  2. 创建第二个新列(D),并将其命名为“Count”。使用此公式,从单元格D2开始,然后一直复制:=IF(A2=A1, D1+1, 1)
  3. 创建第三个新列(E),并将其命名为“Last Line?”。使用此公式,从单元格E2开始,然后一直复制:=A2<>A3
  4. 现在,您可以仅隐藏列B(值)并过滤列E(最后一行?),仅显示TRUE值。

    总结:

       A         B      C                        D                    E
     +---------  -----  -----------------------  -------------------  ----------
    1| Category  Value  Values                   Count                Last Line?
    2| foo       Red    =IF(A2=A1,C1&","&B2,B2)  =IF(A2=A1, D1+1, 1)  =A2<>A3
    3| foo       Blue   =IF(A3=A2,C2&","&B3,B3)  =IF(A3=A2, D2+1, 1)  =A3<>A2
    etc.
    

答案 1 :(得分:0)

是的,使用你正在运行的任何RDBMS(MS SQL,MySQL等)的工具会好得多。

这样的数据透视表在Excel中可能可能。但是,只有你编写一个繁琐的VBA模块 - 我不建议这样做。

但是,MS Access中的任务更简单 - 通常与Excel捆绑在一起。微软可以“轻松”链接Access和Excel,并使用前者对后者运行查询 因此,给出电子表格单元格如下所述:

  1. 为获得最佳效果,请按Object然后按Color对表格进行排序。

  2. 确保电子表格已保存。

  3. 打开MS Access。

  4. 选择文件 - &gt;打开 Ctrl O

  5. 文件类型下,选择 Microsoft Excel

  6. 导航并选择现有的电子表格。

  7. 选择包含表格的工作表或命名范围。

  8. 为链接表提供名称MyPivot

  9. 打开Visual Basic编辑器... 工具 - &gt;宏 - &gt; Visual Basic编辑器 Alt F11

  10. 插入模块并粘贴到此UDF中:

    'Concat returns a comma-seperated list of items
    Public Function Concat (CategoryCol As String, _
                            ItemCol     As String) As String
        Static LastCategory As String
        Static ItemList     As String
    
        If CategoryCol      = LastCategory Then
            ItemList        = ItemList & ", " & ItemCol
        Else
            LastCategory    = CategoryCol
            ItemList        = ItemCol
        End If
        Concat = ItemList
    End Function
    


  11. 保存项目并关闭VB编辑器

  12. 查询下,在设计视图中创建一个新查询。

  13. 切换到 SQL视图

  14. 粘贴此SQL:

    SELECT 
        Object,
        COUNT (Color)                  AS [Count of Color],
        LAST (Concat (Object, Color))  AS [List 'O Colors]
    FROM
        MyPivot
    GROUP BY
        Object
    


  15. 运行查询(按红色感叹号或只选择数据表视图)。

  16. Voilà,完成15个简单的步骤! ;)
    结果:

    Object  Count of Color  List 'O Colors
    bar             3       Blue, Green, Red
    baz             1       Yellow
    foo             2       Blue, Red