首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我想在ms-access中将行转置为列。

我想在ms-access中将行转置为列。
EN

Stack Overflow用户
提问于 2016-11-15 00:43:07
回答 3查看 9.1K关注 0票数 0

我需要转置成MS Access数据库中的列,VBA,SQL这两个代码都是受欢迎的。

表格

代码语言:javascript
运行
复制
    | Name | Ticker | ID | Innovation | Quality | Year |
    | XYZ  |  PQR   | 11 | 1          | 1       | 2009 | 
    | XYZ  |  PQR   | 11 | 0          | 1       | 2010 | 
    | XYZ  |  PQR   | 11 | 1          | 0       | 2011 | 
    | XYZ  |  PQR   | 11 | 1          | 1       | 2012 | 

所需的表

代码语言:javascript
运行
复制
    | Year        | 2009 | 2010 | 2011 | 2012 |
    | Name        | XYZ  | XYZ  |  XYZ |  XYZ |
    | Ticker      | PQR  | PQR  | PQR  | PQR  |
    | ID          | 11   | 11   | 11   | 11   |
    | Innovation  | 1    | 0    | 1    | 1    |
    | Quality     | 1    | 1    | 0    | 1    |

正如您从所需的表中看到的,我正在尝试将Year行作为列,并列出除Year之外的所有列作为我的行。我试过在MS Access中使用Tranform和Pivot函数,但它只透视了一个变量。让我知道你对它的想法。

下面的代码在转置所有变量时失败。

代码语言:javascript
运行
复制
    TRANSFORM Max([Quality])
    SELECT Ticker
    FROM Table
    Where Ticker = "XYZ"
    GROUP BY Ticker
    PIVOT Year;

另外,如果可能的话,我想把它发布为PDF文档。

提前感谢,RVG

EN

回答 3

Stack Overflow用户

发布于 2016-11-15 01:45:36

访问转换并不是很直观,也不容易使用,我不认为你可以这样使用它。每个结果行都应该是表的聚合体。我不知道如何将以前的字段名添加到新的列中。

请参阅工作示例:TRANSFORM and PIVOT in Access 2013 SQL

您真正想要的似乎只是现有数据的一种新表示。

Excel或许能帮上忙。

我从来没有从Access中导出过pdf,但是从Excel中导出很容易。下面是一个示例:

代码语言:javascript
运行
复制
Sub ExportPdf(path As String, Optional openAfter As Boolean)

''calculate best range for print area
Dim lastCol As Integer
Dim firstRow As Integer
Dim lastRow As Integer

lastCol = pt.TableRange2.Columns(pt.TableRange2.Columns.Count).Column
firstRow = pt.TableRange2.Rows(1).Row
lastRow = ms.Cells(pt.TableRange2.Rows.Count * 3, 1).End(xlUp).Row

Worksheets(ContextSheet).PageSetup.PrintArea = Range(Cells(firstRow, 1), Cells(lastRow, lastCol)).Address

Worksheets(ContextSheet).ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
    path & "\Area " & getPivotTablePageFilters(getPivotTable()) & ".pdf", Quality:= _
    xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
    OpenAfterPublish:=openAfter
End Sub
票数 1
EN

Stack Overflow用户

发布于 2016-11-15 06:41:50

这是一个vb脚本,它从TableSource获取数据并将其转置到TableTranspose中。第二个表必须设置一个名为FName的列来获取字段名称,以及源表中每年的列。

代码语言:javascript
运行
复制
Function Transpose()
Set db = CurrentDb()
db.Execute ("delete * from TableTranspose")
Set RS = db.OpenRecordset("TableSource")
Set YrList = db.OpenRecordset("select distinct [Yr] from [TableSource] Group by [Yr]")

For Each F In RS.Fields
    FN = F.Name
    INS = "Insert Into TableTranspose (FName"
    SQL = "Select '" & FN & "'"
    YrList.MoveFirst
    Do While Not YrList.EOF
        YR = YrList.Fields("YR").Value
        INS = INS & ",[" & YR & "]"
        SQL = SQL & ",max(iif(YR=" & YR & ",[" & FN & "])) AS [" & YR & "]"
        YrList.MoveNext
        Loop
    SQL = SQL & " From TableSource"
    db.Execute (INS & ") " & SQL)

Next F
MsgBox ("Done")
End Function

它的工作方式是一次处理一个字段,以匹配所需输出的布局,并循环遍历TableSource的每一年,以查找组成TableTranspose中的行的数据。不管有多少字段,或者它们的名称是什么,都无关紧要。

它将在输出中为年份创建一行,这将是多余的-您可以删除它,或者在必要时添加逻辑以跳过该字段。

这似乎适用于您的样本中4年的数据,并且应该可以扩展到更多年。如果数据中有太多的年份,您可能会达到SQL命令长度的限制,但我认为不会。

如果要过滤TableSource中的记录,可以从靠近底部的db.execute中将WHERE子句添加到行中。

票数 1
EN

Stack Overflow用户

发布于 2016-11-15 02:18:14

数据总是相同的字段名称和年份吗?如果是这样的话,您可以使用UNION查询,如下所示:

代码语言:javascript
运行
复制
Select "Name" as [FName],  max(iif(year="2009",name))as [2009], max(iif(year="2010"
,name)) as [2010], max(iif(year="2011",name)) as [2011], max(iif(year="2012", name)) as [2012] from Table group by FName

Union all Select "Ticker",  max(iif(year="2009",ticker)), max(iif(year="2010"
,ticker)), max(iif(year="2011",ticker)), max(iif(year=-"2012",ticker)) from Table group by FName

Union all Select "ID",  max(iif(year="2009",id)), max(iif(year="2010"
,id)), max(iif(year="2011",is)), max(iif(year="2012",id)) from Table group by FName

Union all Select "Innovation",  max(iif(year="2009",innovation)), max(iif(year="2010"
,innovation)), max(iif(year="2011",innovation)), max(iif(year=-"2012",innovation)) from Table group by FName

 Union all Select "Quality",  max(iif(year="2009",quality)), max(iif(year="2010"
,quality)), max(iif(year="2011",quality)), max(iif(year=-"2012",quality)) from Table group by FName
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40593728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档