具有用户定义字段的 MS Access PIVOT

Posted

技术标签:

【中文标题】具有用户定义字段的 MS Access PIVOT【英文标题】:MS Access PIVOT with User Defined Field 【发布时间】:2013-06-29 22:18:21 【问题描述】:

请各位好心人帮忙!!

我需要查询如下所示的源表。 (NULL 是空白字段)

UNUM Ticket Overflow 
1    135    NULL
1    136    NULL
1    137    NULL
1    138    NULL
1    NULL   2b
2    135    NULL
2    136    NULL
2    137    NULL
3    135    NULL
3    136    NULL
3    137    NULL
3    138    NULL
3    139    NULL
3    140    NULL
3    NULL   66a
4    NULL   12a
5    NULL   14a

我需要生成如下所示的输出。

UserNum Ticket1 Ticket2 Ticket3 Ticket4 Ticket5 Ticket6 Ticket7 Ticket8 Ticket9 Overflow
1       135     136     137     138     Null     Null   Null    Null    Null    2b
2       135     136     137     Null    Null     Null   Null    Null    Null    Null      
3       135     136     137     138     139      140    Null    Null    Null    66a   
4       Null    Null    Null    Null    Null     Null   Null    Null    Null    12a       
5       Null    Null    Null    Null    Null     Null   Null    Null    Null    14a
    源表有多个分配给用户的票证。票数始终最多为 9 张。 用户要么有票,要么有溢出,但这里只能为每个用户溢出。

我在将 Ticket 列中的数据转换为预定义字段名称时遇到问题,例如 Ticket1、Ticket2...

【问题讨论】:

您使用什么逻辑来为 Ticket1 等赋值?但请注意,您不应依赖 Access 存储值的顺序。Access 不保证此顺序。要实现这一点,您需要在表中创建一个额外的编号或带日期戳的列。但是,如果您知道每个值适用于哪个票号,那么这些票号应该存储在表中。 【参考方案1】:

(对于这个答案,我使用 [TicketJournal] 作为源表的名称。)

首先,我们需要为交叉表(枢轴)准备数据。我们可以通过在源表上聚合一个不相等的自连接来生成“Tickets”行,然后在源表上对“溢出”进行简单的 SELECT 来合并它

    SELECT 
        UNUM AS UserNum, 
        CStr(Ticket) AS Item, 
        "Ticket" & COUNT(Ticket) AS Destination
    FROM
        (
            SELECT tj1.UNUM, tj1.Ticket 
            FROM 
                TicketJournal tj1 
                INNER JOIN 
                TicketJournal tj2 
                    ON tj1.UNUM=tj2.UNUM 
                        AND tj1.Ticket>=tj2.Ticket
        )
    GROUP BY UNUM, Ticket
UNION ALL
    SELECT
        UNUM AS UserNum,
        Overflow AS Item,
        "Overflow" AS Destination
    FROM TicketJournal
    WHERE Overflow IS NOT NULL

在 Access 中将该查询保存为 [TicketCrosstabSource],然后运行它以验证它是否返回

UserNum  Item  Destination
-------  ----  -----------
      1  135   Ticket1    
      1  136   Ticket2    
      1  137   Ticket3    
      1  138   Ticket4    
      2  135   Ticket1    
      2  136   Ticket2    
      2  137   Ticket3    
      3  135   Ticket1    
      3  136   Ticket2    
      3  137   Ticket3    
      3  138   Ticket4    
      3  139   Ticket5    
      3  140   Ticket6    
      1  2b    Overflow   
      3  66a   Overflow   
      4  12a   Overflow   
      5  14a   Overflow 

现在我们可以对 [TicketCrosstabSource] 查询进行交叉表查询...

TRANSFORM First(TicketCrosstabSource.[Item]) AS FirstOfItem
SELECT TicketCrosstabSource.[UserNum]
FROM TicketCrosstabSource
GROUP BY TicketCrosstabSource.[UserNum]
PIVOT TicketCrosstabSource.[Destination] In ("Ticket1","Ticket2","Ticket3","Ticket4","Ticket5","Ticket6","Ticket7","Ticket8","Ticket9","Overflow");

...返回

UserNum  Ticket1  Ticket2  Ticket3  Ticket4  Ticket5  Ticket6  Ticket7  Ticket8  Ticket9  Overflow
-------  -------  -------  -------  -------  -------  -------  -------  -------  -------  --------
      1  135      136      137      138                                                   2b      
      2  135      136      137                                                                    
      3  135      136      137      138      139      140                                 66a     
      4                                                                                   12a     
      5                                                                                   14a     

【讨论】:

以上是关于具有用户定义字段的 MS Access PIVOT的主要内容,如果未能解决你的问题,请参考以下文章

MS Access ComboBox 具有自己的值

MS Access:查询以组合行

如何在 MS Access 中创建 Pivot 以避免一种类型的记录出现空值?

查询具有相同字段标题的查询 - MS Access

基于值字段隐藏 MS Access 中的控件

具有用户功能条件的 MS Access 查询停止处理 odbc 数据