2016-11-14 26 views
0

我需要將行轉換爲MS Access數據庫中的列,VBA,SQL這兩個代碼都是受歡迎的。我想將行轉換爲ms-access中的列

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

所需的表

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

正如你所期望的表格中看到,我想有年度行作爲柱,從相隔一年列出所有的列作爲我的行。 我曾嘗試在MS Access中使用Tranform和Pivot函數,但它只能旋轉一個變量。讓我知道你的想法。

以下代碼在轉置所有變量時失敗。

TRANSFORM Max([Quality]) 
    SELECT Ticker 
    FROM Table 
    Where Ticker = "XYZ" 
    GROUP BY Ticker 
    PIVOT Year; 

此外,如果可能我想發佈它作爲PDF文檔。

由於提前, RVG

+1

一個笨拙的解決方法是將其複製到Excel中,使用複製/粘貼轉置,然後從Excel發佈PDF或將轉置表複製回Access。另外,我不認爲我理解所需的表格 - 接下來的4行(即Name =「ABC」)是什麼樣的?這將添加新的行或新的列到所需的表? –

+0

所以我只顯示一個公司,我將從列表框中選擇我將更新代碼爲 Ticker = [Forms]![ComSearch_frm]![Search_lbx]。值 因此,我希望的表格將發佈只有一個公司信息是明智的。 – rvg6991

+0

在這種情況下,Excel不是一個笨拙的解決方法,但真的是最好的選擇。 – Andre

回答

0

址變換是不是真的直觀和易於使用的,我不認爲你可以使用這種方式。每個結果行應該是您的表的聚合。我知道無法將以前的字段名稱添加到新列中。

看到一個工作示例: TRANSFORM and PIVOT in Access 2013 SQL

你真正似乎想僅僅是一個新的演示文稿,以現有的數據。

Excel可能會有所幫助。

我從來沒有從Access導出PDF,但從Excel很容易。以下是一個示例:

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 
+0

在上面的代碼pt是數據透視表 – user6788933

+0

交叉表嚮導有一個原因,它是相當直觀的。但正如你所說,它不適用於OP的要求 - 可以在** 1 **列(「列標題」)上使用PIVOT,而不是全部。 – Andre

+0

如果你真的想要在Access中展示它,你還可以承諾顯示固定的年數,比如最近5年。使用Year(Date).... Year(Date)-5作爲你的標籤和聚合。 – user6788933

0

數據總是與字段名稱和年份相同嗎?如果是的話,你也許可以使用UNION查詢,像:

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

是的列名是固定的,甚至從2005年到2015年。我總共有83個參數,我猜MS Access有UNION運營商的限制。我可以用UNION嗎? – rvg6991

+0

對於很多領域,我會在vba中做到這一點 - 如果可以的話,我會考慮併發布另一個響應。我不知道UNION是否可以處理那麼多來源,但是查詢會很糟糕。對於我在評論中提到的Excel解決方案,你認爲什麼?安德烈支持? –

+0

我收到錯誤'數據類型不匹配條件表達式'。請幫我解決這個錯誤。 – rvg6991

0

這是一個VB腳本,從TableSource取數據,並將其調換到TableTranspose。第二個表必須設置一個名爲FName的列,以獲取源表中每個年份的字段名稱和列。

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。它們應該有多少個領域或者他們命名的都不重要。

它將在Year的輸出中創建一行,這將是多餘的 - 您可以刪除它,或者添加邏輯以在必要時跳過該字段。

對於樣本中的4年數據,這似乎可以正常工作,並且應該將OK延長到更多年。如果數據中的年份太長,您可能會遇到SQL命令長度的限制,但我認爲不是。

如果您正在過濾來自TableSource的記錄,則可以在靠近底部的db.execute的行上添加WHERE子句。

+0

最後一個註釋 - 在輸出表中,每列只能有一個數據類型,所以我假定所有的源數據都是文本,並且TableTranspose中的字段都是文本。如果TableSource中的數字數據不是年,則可能需要在SQL命令的組合中插入一些引號(單引號)。 –

+0

非常感謝。但我收到錯誤 參數太少。預計1. 如果我們嘗試調試它需要我 db.Execute(INS&「)」&SQL) 在此先感謝。 – rvg6991

+0

可能因爲我需要將TableSource字段名稱更改爲「Yr」,因爲「Year」是保留字 –