使用通用列标题的交叉表查询

时间:2013-05-07 16:51:00

标签: sql ms-access

这可能很容易,但无论如何我都坚持不懈,我的搜索没有提出任何有用的东西。我的数据目前采用以下格式:

    ID        Code  
|1212050   |   LB   |
|1212050   |   LJ   |
|1212050   |   LK   |
|1212052   |   FB   |
|B12L076   |   CL   |
|B12L076   |   LK   |

有许多可能的代码,但我需要查询以这种格式显示前十个(即使ID只有一个):

    ID        Code1    Code2    Code3     
|1212050   |   LB   |   LJ    |   LK   |   
|1212052   |   FB   |         |        |     
|B12L076   |   CL   |   LK    |        |        

我可以轻松创建一个交叉表查询,该查询创建一个视图,其中包含代码作为列标题,但创建了许多列。我需要它的标签为“Code1”到“Code10”的列,无论ID中使用了哪些代码。这是踢球者:它必须在Access sql。

非常感谢任何帮助。

我将用于测试查询的测试组是:

     ID   Code
 |1212044|  LJ|
 |1212044|  LJ|
 |1212044|  LJ|
 |1212050|  HT|
 |1212050|  HT|
 |1212050|  HT|
 |1212050|  HT|
 |1212050|  HT|
 |1212050|  HT|
 |1212050|  HT|
 |1212050|  HT|
 |1212050|  HT|
 |1212050|  LB|
 |1212050|  HT|
 |1212050|  HT|
 |1212050|  HT|
 |1212050|  HT|
 |1212050|  HT|
 |1212050|  HT|
 |1212050|  HT|
 |1212050|  CL|
 |1212050|  LK|
 |1212050|  LK|
 |1212050|  LK|
 |1212050|  CL|
 |1212050|  LK|
 |1212050|  CL|
 |1212050|  LK|
 |1212050|  CL|
 |1212050|  LK|
 |1212050|  LJ|
 |1212052|  FB|
 |1212052|  FB|
 |1212052|  LB|
 |1212052|  FB|
 |B12L076|  CL|
 |B12L076|  LK|
 |B12L076|  CL|
 |B12L076|  LK|
 |B12L076|  LK|
 |B12L076|  CL|
 |B12L076|  LK|
 |B12L076|  CL|
 |B12L076|  LK|
 |B12L076|  LK|
 |B12L076|  CL|
 |B12L076|  LK|
 |B12L076|  CL|
 |B12L076|  LK|
 |B12L076|  CL|
 |B12L076|  LK|
 |B12L076|  CL|
 |B12L076|  LK|
 |B12L076|  CL|
 |B12L076|  LK|
 |B12L076|  CL|
 |B12L076|  LK|
 |B12L076|  CL|
 |B12L076|  LK|
 |B12L076|  CL|
 |B12L076|  LK|
 |B12L076|  CL|
 |B12L076|  LK|
 |B12L103|  LB|
 |B13A072|  CL|
 |B13A072|  LK|
 |B13A072|  HT|

3 个答案:

答案 0 :(得分:0)

我可以想办法用查询来完成所有这些:

使用自动编号类型

为表添加索引字段

设置查询以查找每个ID的最小索引值

设置第二个查询以查找每个ID /代码组合的序列号,计算为1+记录的索引减去先前查询中ID的索引

第三个查询是第二个查询的交叉表,其中ID为行,序列号为列 - 您可以选择序列号< = 10来限制列数。交叉表中的“值”字段必须计算为代码值的“第一”或其他一些文本函数。

进一步思考后,我认为您可以通过执行第二个查询中描述的计算并将其用作第三个查询中所述的列标题来组合第二个和第三个查询。我倾向于将事情分解为较小的查询,以使每个查询变得简单。

答案 1 :(得分:0)

让我们一步一步来做。

第一步是将表连接到自身,以便列出每个ID下的所有不同代码对。

完成后,我们可以应用分组将每个代码与其在给定ID下的代码中的排名一起使用。

在代码中:

Select a.ID, a.Code AS EarlierCode, b.Code AS LaterCode
from [YourTable] AS a
INNER JOIN [YourTable] AS b
ON a.ID = b.ID
WHERE a.Code <= b.Code

将此查询保存为YourPairs。

现在

Select ID, LaterCode AS Code, "Code" & Count(*) AS Label
from [YourPairs] 
HAVING Count(*) <= 10

保存第二个查询,然后使用Label字段作为列标签构建交叉表。

答案 2 :(得分:0)

以下是使用Microsoft Access的有效解决方案。

表1-包含列ID和代码

Query1-使用Table1标识ID和代码的唯一组合

SELECT Table1.ID, Table1.Code
FROM Table1
GROUP BY Table1.ID, Table1.Code
ORDER BY Table1.ID, Table1.Code;

Query2-使用Query1添加唯一的代码序列

SELECT Query1.ID, Query1.Code, 'Code ' & Count([Query1_1].[Code]) AS [Code Seq]
FROM Query1 LEFT JOIN Query1 AS Query1_1 ON Query1.ID = Query1_1.ID
WHERE (((Query1_1.Code)<=[Query1].[Code]))
GROUP BY Query1.ID, Query1.Code
ORDER BY Query1.ID, Query1.Code;

Query3-使用Query2生成所需的交叉表,每个ID限制为10个代码

TRANSFORM Max(Query2.Code) AS MaxOfCode
SELECT Query2.ID
FROM Query2
GROUP BY Query2.ID
ORDER BY Query2.ID
PIVOT Query2.[Code Seq] In ("Code 1","Code 2","Code 3","Code 4","Code 5","Code 6","Code 7","Code 8","Code 9","Code 10");

结果-使用上述测试数据

ID         Code 1  Code 2  Code 3  Code 4  Code 5  Code 6  Code 7  Code 8  Code 9  Code 10
1212044    LJ                                   
1212050    CL      HT      LB      LJ      LK
1212052    FB      LB
B12L076    CL      LK
B12L103    LB
B13A072    CL      HT      LK