将行转换为Access中的列

时间:2013-12-03 09:07:07

标签: c# sql ms-access pivot

我已经阅读了很多与我的问题相关的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],多次写入日期的地方,它始终是相同的。

4 个答案:

答案 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