【问题标题】:Create comma-delimited values in Excel (using PivotTable)?在 Excel 中创建逗号分隔值(使用数据透视表)?
【发布时间】:2011-05-22 11:48:59
【问题描述】:

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

对象颜色
富红
富蓝
酒吧红
酒吧蓝色
酒吧绿色
baz 黄色

我想要一张如下表:

颜色颜色的对象计数
foo 2 红蓝
栏 3 红、蓝、绿
baz 1 黄色

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

【问题讨论】:

标签: excel pivot-table denormalization csv


【解决方案1】:

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

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

  1. 创建一个新列 (C),并将其命名为“值”。使用此公式,从单元格 C2 开始并一直向下复制:=IF(A2=A1, C1&","&B2, B2)
  2. 创建第二个新列 (D),并将其命名为“Count”。使用这个公式,从单元格 D2 开始,一直向下复制:=IF(A2=A1, D1+1, 1)
  3. 创建第三个新列 (E),并将其命名为“Last Line?”。使用这个公式,从单元格 E2 开始,一直向下复制:=A2<>A3

您现在可以仅针对 TRUE 值隐藏 B 列(值)并过滤 E 列(最后一行?)。

总结:

   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.

【讨论】:

    【解决方案2】:

    是的,您最好使用您正在运行的任何 RDBMS 的工具(MS SQL、MySQL 等)。

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

    但是,MS Access 中的任务更简单——它通常与 Excel 捆绑在一起。 Microsoft 使链接 Access 和 Excel 以及使用前者在后者上运行查询变得“容易”。
    因此,给定电子表格单元格:

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

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

    3. 打开 MS Access。

    4. 选择文件 --> 打开   (CtrlO)

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

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

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

    8. 将链接表命名为MyPivot

    9. 打开 Visual Basic 编辑器... 工具 --> 宏 --> Visual Basic 编辑器 (AltF11)

    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. 瞧,只需 15 个简单步骤即可完成! ;)
      结果:

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

    【讨论】:

    • 哇,太激烈了。如果我有空闲时间,我将使用 UDF 编辑 OP 以在 SQL 中执行相同的操作。感谢您的回答!
    【解决方案3】:

    更简单的方法是在创建数据透视表时将数据添加到数据模型,然后使用“度量”(称为“颜色”),如下所示:

    =CONCATENATEX(Table1,[Color],", ")
    

    然后将“颜色”字段添加到枢轴的值部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-10
      • 1970-01-01
      • 1970-01-01
      • 2019-02-27
      • 1970-01-01
      相关资源
      最近更新 更多