我已经阅读了很多与我的问题相关的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]应该将这两个值相加。我已经编辑了表格,在转换后的表格上我写了ex。 15 + 19或35 + 20,仅说明总结了哪些值。
还有一个编辑,希望是最后一个。其中一个[Name] BB在[Data]中有一个Datetime类型。 NameID可以是哪个,无关紧要。所以我需要一个查询,它在[Name] BB的总结时做了一个例外,所以它不会像对待其他[Name] s [Data]那样总结它。对于相同的[名称]和[名称ID],多次写入日期的地方,它始终是相同的。
答案 0 :(得分:2)
要在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
答案 1 :(得分:1)
试试这个...在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
答案 2 :(得分:1)
我认为你需要这个
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;
答案 3 :(得分:1)
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