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

发布于 2024-10-06 09:27:38 字数 446 浏览 4 评论 0原文

有没有办法在 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 来计算,但这是针对单个即席查询的,我想要一种快速而简单的方法来获取非规范化数据。最后,发布此内容可能比编写 UDF 花费的时间更长,但是......

Is there a way to generate comma-delimited values in Excel (optimally using a PivotTable)? Consider the following data:

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

I'd like to get a table like the following:

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

Is this possible in Excel? The data is coming from a SQL query, so I could write a UDF with a recursive CTE to calculate, but this was for a single ad-hoc query, and I wanted a quick-and-dirty way to get the denormalized data. In the end, it's probably taken longer to post this than to write the UDF, but...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

呆头 2024-10-13 09:27:38

这是一个更简单的答案,改编自这个超级用户答案(HT到@yioann 指出了这一点,@F106dart 表示原始内容):

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

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

您现在可以隐藏 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.

Here's a much simpler answer, adapted from this superuser answer (HT to @yioann for pointing it out and @F106dart for the original):

Assuming the data is in columns A (Category) and B (Value):

  1. Create a new column (C), and name it "Values". Use this formula, starting in cell C2 and copying all the way down: =IF(A2=A1, C1&","&B2, B2)
  2. Create a second new column (D), and name it "Count". Use this formula, starting in cell D2, and copying all the way down: =IF(A2=A1, D1+1, 1)
  3. Create a third new column (E), and name it "Last Line?". Use this fomula, starting in cell E2, and copying all of the way down: =A2<>A3

You can now hide column B (Value) and filter column E (Last Line?) for only the TRUE values.

In summary:

   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.
帅冕 2024-10-13 09:27:38

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

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

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

  1. 为了获得最佳结果,请按对象对表格进行排序,然后按颜色

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

  3. 打开 MS Access。

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

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

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

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

  8. 将链接表命名为 MyPivot

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

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

    'Concat 返回以逗号分隔的项目列表
    公共函数 Concat (CategoryCol As String, _
                            ItemCol 作为字符串)作为字符串
        静态 LastCategory 作为字符串
        作为字符串的静态项目列表
    
        如果 CategoryCol = LastCategory 那么
            项目列表 = 项目列表 & ”、“ &项目列
        别的
            最后类别 = 类别列
            项目列表 = 项目列
        结束如果
        连接 = 项目列表
    结束功能
    

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

  12. 在 < em>查询,在设计视图中创建新查询。

  13. 切换到SQL 视图

  14. 粘贴此 SQL:

    <前><代码>选择
    目的,
    COUNT(颜色)AS [颜色计数],
    LAST(Concat(对象,颜色))AS [列出 'O 颜色]

    我的数据透视表
    分组依据
    目的

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

  16. 瞧,只需 15 个简单步骤即可完成!   ;)
    结果:

    颜色列表“O 颜色”的对象计数
    条 3 蓝色、绿色、红色
    巴兹 1 黄色
    foo 2 蓝色、红色
    

Yes, you would be much better off using the tools of whatever RDBMS you're running (MS SQL, MySQL, etc.).

Such a pivot table is possible in Excel. But, only if you write a cumbersome VBA module -- which I don't recommend.

However, the task is simpler in MS Access -- which usually comes bundled with Excel. Microsoft makes it "easy" to link Access and Excel and to use the former to run queries on the latter.
So, given the spreadsheet cells as stated:

  1. For best results, sort the table by Object and then by Color.

  2. Make sure the spreadsheet is saved.

  3. Open up MS Access.

  4. Select File --> Open   (CtrlO)

  5. Under Files of type, select Microsoft Excel

  6. Navigate to and choose your existing spreadsheet.

  7. Choose the worksheet or named range that contains your table.

  8. Give the linked table the name MyPivot.

  9. Open the Visual Basic Editor... Tools --> Macro --> Visual Basic Editor (AltF11)

  10. Insert a module and paste in this 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. Save the project and close the VB editor

  12. Under Queries, Create a new query in design view.

  13. Switch to the SQL View.

  14. Paste in this SQL:

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

  15. Run the query (Press the red exclamation mark or just select the Datasheet View).

  16. Voilà, done in 15 easy steps!   ;)
    Results:

    Object  Count of Color  List 'O Colors
    bar             3       Blue, Green, Red
    baz             1       Yellow
    foo             2       Blue, Red
    
墨小沫ゞ 2024-10-13 09:27:38

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

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

然后将“颜色”字段添加到数据透视表的值部分。

An even easier way is to add the data to the data model when you create the pivot table and then use a "measure" (called "Colours") as follows:

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

Then add the "Colours" field to the values portion of the pivot.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文