将行转换为Access中的列

我已经阅读了与我的问题相关的Stack Overflow上的许多问题,但我认为它们并不能完全解决我的问题。 基本上我下载了包含大量数据的XML数据集,并将该数据插入到MS Access数据库中。 我想要做的是转换数据,以便某些特定的行成为列。

现在我可以在将数据插入数据库之前在代码中手动执行此操作,但这需要大量时间和代码更改,因此我想知道是否可以使用MS Access执行此操作。

这是我的表基本上看起来如何,以及我想如何转换它。

在我的案例中,索引并不那么重要

[Table1] => [Table1_converted] [Index] [Name] [Data] [NameID] [NameID] [AA] [BB] [CC] [DD] 1 AA 14 1 1 14 date1 64 61 2 BB(date) 42 1 2 15+19 date2 67+21 63+12 3 CC 64 1 3 9 10 4 DD 61 1 4 date4 1 87 5 AA 15 2 6 BB(date) 35 2 7 CC 67 2 8 DD 63 2 9 AA 9 3 10 CC 10 3 11 AA 19 2 12 BB(date) 20 2 13 CC 21 2 14 DD 12 2 15 BB(date) 83 4 16 CC 1 4 17 DD 87 4 

忘了提一下,列[名称]下的值不是真正的AA BB CC。 它们比那更复杂。 AA实际上就像“01 – NameAA”,没有引号。

忘记在我的问题中提到一个重要元素,如果[姓名] ex。 表中存在具有相同[NameID]的AA,然后[Data]应该将这两个值相加。 我已经编辑了表格,在转换后的表格上我已经写过了。 15 + 19或35 + 20,仅说明哪些值相加。

还有一个编辑,希望是最后一个。 其中一个[Name] BB在[Data]中有一个Datetime类型。 NameID可以是哪个,无关紧要。 所以我需要一个查询,它在[Name] BB上总结时会发生exception,所以它不会像对待其他[Name] s [Data]那样总结它。 对于相同的[Name]和[NameID],多次写入日期的地方,它始终是相同的。

要在Access中完成此任务,您需要做的就是

 TRANSFORM Sum([Data]) AS SumOfData SELECT [NameID] FROM [Table1] GROUP BY [NameID] PIVOT [Name] 

编辑重新:修改过的问题

要以不同的方式处理某些[Name],我们需要先组合结果( Sum() s等),然后交叉表示结果

对于[表1]中的测试数据:

 Index Name Data NameID ----- ---- ---------- ------ 1 AA 14 1 2 BB 2013-12-01 1 3 CC 64 1 4 DD 61 1 5 AA 15 2 6 BB 2013-12-02 2 7 CC 67 2 8 DD 63 2 9 AA 9 3 10 CC 10 3 11 AA 19 2 12 BB 2013-12-02 2 13 CC 21 2 14 DD 12 2 15 BB 2013-12-04 4 16 CC 1 4 17 DD 87 4 

查询

 TRANSFORM First(columnData) AS whatever SELECT [NameID] FROM ( SELECT [NameID], [Name], Sum([Data]) AS columnData FROM [Table1] WHERE [Name] <> 'BB' GROUP BY [NameID], [Name] UNION ALL SELECT DISTINCT [NameID], [Name], [Data] FROM [Table1] WHERE [Name] = 'BB' ) GROUP BY [NameID] PIVOT [Name] 

产生

 NameID AA BB CC DD ------ -- ---------- -- -- 1 14 2013-12-01 64 61 2 34 2013-12-02 88 75 3 9 10 4 2013-12-04 1 87 

试试这个…在SQL查询中可能是你的答案

  SELECT NameID , [AA] as AA,[BB] as BB,[CC] as CC,[DD] as DD FROM ( SELECT Name,Data,NameID FROM Table1 )PivotData PIVOT ( max(Data) for Name in ([AA],[BB],[CC],[DD]) ) AS Pivoting 

我想你需要这个

1)将所有Table1都放在SQL Server中

2)然后运行以下查询

 DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX) select @cols = STUFF((SELECT distinct ',' + QUOTENAME(Name) from [Table1] FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'') set @query = 'SELECT countryid,' + @cols + ' from ( select NameID, Name from Table1 cc ) T pivot ( max (Name) for languagename in (' + @cols + ') ) p ' execute sp_executesql @query; 
 DECLARE @Table1 TABLE ([Index] INT,[Name] CHAR(2),[Data] INT,[NameID] INT) INSERT INTO @Table1 VALUES (1,'AA',14,1), (2,'BB',42,1), (3,'CC',64,1), (4,'DD',61,1), (5,'AA',15,2), (6,'BB',35,2), (7,'CC',67,2), (8,'DD',63,2), (9,'AA',9,3), (10,'CC',10,3), (11,'BB',83,4), (12,'CC',1,4), (13,'DD',87,4) SELECT [NameID] , ISNULL([AA], '') AS [AA], ISNULL([BB], '') AS [BB] , ISNULL([CC], '') AS [CC], ISNULL([DD], '') AS [DD] FROM ( SELECT NAME, DATA, NAMEID FROM @Table1 )q PIVOT ( SUM(DATA) FOR NAME IN ([AA], [BB], [CC], [DD]) )P 

结果集

 NameID AA BB CC DD 1 14 42 64 61 2 15 35 67 63 3 9 10 4 83 1 87