具有用户定义字段的 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的主要内容,如果未能解决你的问题,请参考以下文章