2016-11-14 8 views
0

Ich muss Zeilen in Spalten in MS Access-Datenbank, VBA, SQL beide Codes sind willkommen.Ich möchte Zeilen in Spalten in MS-Access transponieren

Tabelle

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

Gewünschte Tabelle

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

Wie Sie aus der gewünschten Tabelle sehen können, Ich versuche, das Jahr Zeile als Spalte zu haben und alle Spalten abgesehen von Jahr Liste als mein Reihen. Ich habe versucht, mit Hilfe von Tranform und Pivot-Funktion in MS Access, aber es nur eine Variable Pivots. Lass mich deine Gedanken darüber wissen.

Der folgende Code konnte nicht alle Variablen transponieren.

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

Auch, wenn möglich, möchte ich es als PDF-Dokument veröffentlichen.

Vielen Dank im Voraus, RVG

+1

Eine umständliche Lösung besteht darin, es nach Excel zu kopieren, Copy/Paste Transpose zu verwenden und dann die PDF-Datei aus Excel zu veröffentlichen oder die transponierte Tabelle wieder in Access zu kopieren. Außerdem glaube ich nicht, dass ich die gewünschte Tabelle verstehe - wie würden die nächsten 4 Zeilen, also für Name = "ABC" aussehen? Würde das neue Zeilen oder neue Spalten zur gewünschten Tabelle hinzufügen? –

+0

Also würde ich nur eine Firma anzeigen, die ich aus der Liste auswählen würde, für die ich den Code aktualisiert hätte: Ticker = [Formulare]! [ComSearch_frm]! [Search_lbx] .Wert Also meine gewünschte Tabelle wäre zu veröffentlichen nur eine Unternehmensinformation Jahrweise. – rvg6991

+0

In diesem Fall Excel ist keine plumpe Workaround aber wirklich die beste Option. – Andre

Antwort

0

Zugang VERÄNDERN nicht wirklich intuitiv und einfach zu bedienen ist, und ich glaube nicht, dass Sie es auf diese Weise nutzen können. Jede Ergebniszeile soll eine Zusammenfassung Ihrer Tabelle sein. Ich kenne keine Möglichkeit, die vorherigen Feldnamen in eine neue Spalte zu bringen.

Sehen Sie ein funktionierendes Beispiel: TRANSFORM and PIVOT in Access 2013 SQL

Was Sie wirklich zu wollen scheinen ist nur eine neue Präsentation zu den vorhandenen Daten.

Excel könnte helfen.

Ich habe nie pdf aus Access exportiert, aber aus Excel ist einfach. Hier ein Beispiel:

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

im obigen Code pt ist PivotTable – user6788933

+0

Der Kreuztabellen-Assistent ist aus einem bestimmten Grund, und es ist ziemlich intuitiv. Aber wie Sie sagen, wird es nicht für die Anforderungen von OP funktionieren - man kann PIVOT auf ** eine ** Spalte (die "Spaltenüberschrift"), nicht alle von ihnen. – Andre

+0

Wenn Sie es wirklich in Access anzeigen möchten, können Sie sich auch verpflichten, eine feste Anzahl von Jahren wie die letzten 5 anzuzeigen. Verwenden Sie Jahr (Datum) .... Jahr (Datum) -5 für Ihre Etiketten und Aggregate. – user6788933

0

Sind die Daten immer die gleiche Menge von Feldnamen und Jahren? Wenn ja, könnten Sie in der Lage sein, eine UNION-Abfrage zu verwenden, so etwas wie:

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

Ja die Spaltennamen sind fest und sogar die Jahre von 2005 bis 2015. Ich habe insgesamt 83 Parameter, ich denke, MS Access haben UNION Betreiber Einschränkungen. Kann ich das mit UNION machen? – rvg6991

+0

Für so viele Felder würde ich es in vba tun - ich werde darüber nachdenken und eine andere Antwort posten, wenn ich kann. Ich weiß nicht, ob UNION so viele Quellen verarbeiten kann, aber die Abfrage wird hässlich sein. Was haben Sie von der Excel-Lösung gehalten, die ich in den Kommentaren notiert habe und die Andre unterstützt hat? –

+0

Ich erhalte den Fehler 'Datentyp Mismatch in Kriterienausdruck'. Bitte helfen Sie mir, den Fehler zu beheben. – rvg6991

0

Dies ist ein VB-Skript, das die Daten von Table nimmt und transponiert sie in TableTranspose. Die zweite Tabelle muss mit einer Spalte namens FName eingerichtet werden, um die Feldnamen und Spalten für jedes Jahr in der Quelltabelle zu übernehmen.

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 

Dies funktioniert, indem zu einem Zeitpunkt ein Feld Bearbeitung des Layouts der gewünschten Ausgabe und Weiterschleifen jedes Jahr der Table übereinstimmen, die Daten zu finden, die Zeile in TableTranspose zu bilden. Es sollte egal sein, wie viele Felder es gibt oder wie sie benannt sind.

Es wird eine Zeile in der Ausgabe für das Jahr erstellt, die redundant ist - Sie können sie löschen oder Logik hinzufügen, um dieses Feld bei Bedarf zu überspringen.

Dies scheint mit den 4 Jahren Daten in Ihrer Probe gut zu funktionieren, und sollte OK zu mehr Jahren verlängern. Es ist möglich, dass Sie ein Limit für die SQL-Befehlslänge erreichen, wenn die Daten zu viele Jahre alt sind, aber ich denke nicht.

Wenn Sie die Datensätze aus TableSource filtern, können Sie die WHERE-Klausel in der Zeile nur aus der Datei db.execute unten hinzufügen.

+0

Ein letzter Kommentar - in der Ausgabetabelle kann jede Spalte nur einen Datentyp haben, also nahm ich an, dass alle Quelldaten Text sind und dass die Felder in TableTranspose alle Text sind. Sie müssen möglicherweise einige Anführungszeichen (einfache Anführungszeichen) in den Aufbau des SQL-Befehls einfügen, wenn in TableSource außer dem Jahr numerische Daten vorhanden sind. –

+0

Vielen Dank. Aber ich erhalte den Fehler Zu wenige Parameter. Erwartet 1. Wenn wir versuchen, es zu debuggen, dauert es mich db.Execute (INS & ")" & SQL) Vielen Dank im Voraus. – rvg6991

+0

Wahrscheinlich, weil ich den Namen der TableSource-Felder in "Yr" ändern musste, da "Year" ein reserviertes Wort ist –

Verwandte Themen