Transform/Transpose MS Access 中的行到列
Transform/Transpose rows to columns in MS Access
我在 Access 数据库中有一个 table,我想在 MS Access 中使用 SQL 查询将 AT_cd
列转换为行(如下结果 table)但我无法正确转换它。我尝试使用以下查询进行转换,但它正在将 AT_cd 转换为 200 多列。我不确定如何更正我的查询。下面是提供的示例 table 和期望的结果 table。非常感谢任何帮助。
Table:
ID AT_cd
01 BB01A
01 IZ76N
02 AC21B
02 AX30A
02 ZA98A
03 AC21N
03 ZA76M
03 RT67T
04 QS70P
04 TR67A
04 GB45L
04 AC78M
想要的结果:
ID AT_cd1 AT_cd2 AT_cd3 AT_cd4
01 BB01A IZ76N
02 AC21B AX30A ZA98A
03 AC21N ZA76M RT67T
04 QS70P TR67A GB45L AC78M
代码:
TRANSFORM FIRST(AT_cd)
SELECT [ID]
FROM Table1
GROUP BY [ID]
PIVOT AT_cd
恐怕你想要的是不可能的。您正试图根据记录列表中记录的顺序获取结果,但无法做到这一点。您需要创建一个特定的字段来说明顺序,然后就可以了。表示订单的字段类似于:
ID AT_cd Order
01 BB01A AT_cd1
01 IZ76N AT_cd2
02 AC21B AT_cd1
02 AX30A AT_cd2
02 ZA98A AT_cd3
03 AC21N AT_cd1
03 ZA76M AT_cd2
03 RT67T AT_cd3
04 QS70P AT_cd1
04 TR67A AT_cd2
04 GB45L AT_cd3
04 AC78M AT_cd4
执行此操作后,以下转换会产生您想要的结果:
TRANSFORM First(AT_cd)
SELECT ID
FROM Table_name
GROUP BY ID
ORDER BY ID
PIVOT Order
更多信息请见 LightningGuide.net。
使用 DCount
您可以使用此查询来关闭,该查询还将对列值进行排序:
TRANSFORM
First(QueryQ.AT_cd)
SELECT
QueryQ.ID
FROM
(SELECT
ID,
AT_cd,
"AT_cd" & CStr(DCount("*", "TableQ", "[ID] = '" & ID & "' And [AT_cd] <= '" & AT_cd & "'")) AS Sequence
FROM
TableQ) As QueryQ
GROUP BY
QueryQ.ID
PIVOT
QueryQ.Sequence;
Edit:来自 Duane Hookom 有人建议我只使用 SQL 这种替代方法,因此可能更快:
TRANSFORM
First(QueryQ.AT_cd)
SELECT
QueryQ.ID
FROM
(SELECT TableQ.ID, TableQ.AT_cd, Count(TableQ.AT_cd) AS Sequence
FROM TableQ
INNER JOIN TableQ AS TableQ_1 ON TableQ.ID = TableQ_1.ID
WHERE (((TableQ.AT_cd)>=[TableQ_1].[AT_cd]))
GROUP BY TableQ.ID, TableQ.AT_cd) As QueryQ
GROUP BY
QueryQ.ID
PIVOT
"AT_cd" & QueryQ.Sequence;
我在 Access 数据库中有一个 table,我想在 MS Access 中使用 SQL 查询将 AT_cd
列转换为行(如下结果 table)但我无法正确转换它。我尝试使用以下查询进行转换,但它正在将 AT_cd 转换为 200 多列。我不确定如何更正我的查询。下面是提供的示例 table 和期望的结果 table。非常感谢任何帮助。
Table:
ID AT_cd
01 BB01A
01 IZ76N
02 AC21B
02 AX30A
02 ZA98A
03 AC21N
03 ZA76M
03 RT67T
04 QS70P
04 TR67A
04 GB45L
04 AC78M
想要的结果:
ID AT_cd1 AT_cd2 AT_cd3 AT_cd4
01 BB01A IZ76N
02 AC21B AX30A ZA98A
03 AC21N ZA76M RT67T
04 QS70P TR67A GB45L AC78M
代码:
TRANSFORM FIRST(AT_cd)
SELECT [ID]
FROM Table1
GROUP BY [ID]
PIVOT AT_cd
恐怕你想要的是不可能的。您正试图根据记录列表中记录的顺序获取结果,但无法做到这一点。您需要创建一个特定的字段来说明顺序,然后就可以了。表示订单的字段类似于:
ID AT_cd Order
01 BB01A AT_cd1
01 IZ76N AT_cd2
02 AC21B AT_cd1
02 AX30A AT_cd2
02 ZA98A AT_cd3
03 AC21N AT_cd1
03 ZA76M AT_cd2
03 RT67T AT_cd3
04 QS70P AT_cd1
04 TR67A AT_cd2
04 GB45L AT_cd3
04 AC78M AT_cd4
执行此操作后,以下转换会产生您想要的结果:
TRANSFORM First(AT_cd)
SELECT ID
FROM Table_name
GROUP BY ID
ORDER BY ID
PIVOT Order
更多信息请见 LightningGuide.net。
使用 DCount
您可以使用此查询来关闭,该查询还将对列值进行排序:
TRANSFORM
First(QueryQ.AT_cd)
SELECT
QueryQ.ID
FROM
(SELECT
ID,
AT_cd,
"AT_cd" & CStr(DCount("*", "TableQ", "[ID] = '" & ID & "' And [AT_cd] <= '" & AT_cd & "'")) AS Sequence
FROM
TableQ) As QueryQ
GROUP BY
QueryQ.ID
PIVOT
QueryQ.Sequence;
Edit:来自 Duane Hookom 有人建议我只使用 SQL 这种替代方法,因此可能更快:
TRANSFORM
First(QueryQ.AT_cd)
SELECT
QueryQ.ID
FROM
(SELECT TableQ.ID, TableQ.AT_cd, Count(TableQ.AT_cd) AS Sequence
FROM TableQ
INNER JOIN TableQ AS TableQ_1 ON TableQ.ID = TableQ_1.ID
WHERE (((TableQ.AT_cd)>=[TableQ_1].[AT_cd]))
GROUP BY TableQ.ID, TableQ.AT_cd) As QueryQ
GROUP BY
QueryQ.ID
PIVOT
"AT_cd" & QueryQ.Sequence;