Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 具有通用列标题的交叉表查询_Sql_Ms Access - Fatal编程技术网

Sql 具有通用列标题的交叉表查询

Sql 具有通用列标题的交叉表查询,sql,ms-access,Sql,Ms Access,这可能很容易,但我仍然坚持下去,而且我的搜索结果也没有找到任何有用的东西。我的数据目前采用这种格式: ID Code |1212050 | LB | |1212050 | LJ | |1212050 | LK | |1212052 | FB | |B12L076 | CL | |B12L076 | LK | ID Code1 Code2 Code3 |1

这可能很容易,但我仍然坚持下去,而且我的搜索结果也没有找到任何有用的东西。我的数据目前采用这种格式:

    ID        Code  
|1212050   |   LB   |
|1212050   |   LJ   |
|1212050   |   LK   |
|1212052   |   FB   |
|B12L076   |   CL   |
|B12L076   |   LK   |
    ID        Code1    Code2    Code3     
|1212050   |   LB   |   LJ    |   LK   |   
|1212052   |   FB   |         |        |     
|B12L076   |   CL   |   LK    |        |        
有许多可能的代码,但我需要查询以这种格式显示前十个(即使ID只有一个):

    ID        Code  
|1212050   |   LB   |
|1212050   |   LJ   |
|1212050   |   LK   |
|1212052   |   FB   |
|B12L076   |   CL   |
|B12L076   |   LK   |
    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|

我可以想出一种通过查询来完成这一切的方法:

使用自动编号类型向表中添加索引字段

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

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


第三个查询是第二个查询的交叉表,ID作为行,序号作为列-您可以选择序号让我们一步一步地执行此操作

第一步是将表连接到自身,以便在每个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
选择a.ID,a.代码作为早期代码,b.代码作为后期代码
从[你的桌子]作为
将[YourTable]内部联接为b
在a.ID=b.ID上

其中,下面的a.Code是使用Microsoft Access的工作解决方案

表1-包含列ID和代码

SELECT Table1.ID, Table1.Code
FROM Table1
GROUP BY Table1.ID, Table1.Code
ORDER BY Table1.ID, Table1.Code;
Query1-使用表1确定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;
结果-使用上述测试数据

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 身份证代码1代码2代码3代码4代码5代码6代码7代码8代码9代码10 1212044 LJ 1212050 CL HT LB LJ LK 1212052磅 B12L076 CL LK B12L103磅 B13A072 CL HT LK
不幸的是,这行不通。我们的数据管理应用程序将删除并重新创建访问表,因此无法修改表结构。我们只能使用Access sql查询来查询它。我们甚至不能使用VBA。这是非常有限的。我一直在研究如何在初始查询中添加一个字段,该字段的每个ID都有一个递增计数器(因此该值将是code1、code2等),以便在交叉表中使用它,但我还没有找到一种方法。你知道怎么做吗?我讨厌创建一个新表,但你可能需要这样做-你能从源数据运行make table查询,并在新表中包含一个auto number字段吗?(注意-如果源数据不是,则应根据ID和代码进行排序。)如果可以这样做,则上述过程应有效注意,这仅根据需要使用Access sql查询。我只是希望允许您保存Access sql查询。我不知道我是否未能很好地解释这一点,或者我只是无法让您的sql正常工作。当我运行sql(使用我的表和字段名)时,它只返回了9条记录。只是澄清一下,有很多代码,但每个ID最多只能有10条。因此,他们需要一个查询来显示所有列为1-10的ID来保存代码。所有代码列都必须在那里,即使它们包含空值。使用问题中包含的示例记录,我希望有六条记录,初始表的每行一条。如果您有一个更大的测试集,您能与我们共享吗?Dan,在交叉表的定义中,predeclare“Code1”到“Code10”作为列标题。然后,您的输出中将包含所有十个“代码”列,即使其中一些为空。感谢您添加测试数据。从中,我看到您有多个包含相同数据的行。您的问题变得更难了,因为我不知道如何让SQL查询说出显示| 1212044 | LJ |的第一行、第二行和第三行之间的差异。原始数据表有一个三字段主键。ID只是使其唯一所需的字段之一。我应该提到这一点。我没有包括这些行,因为它们包含敏感信息。当我运行sql时,我用一个查询替换了表,该查询首先根据ID对表进行分组。