SQL Zeilen in Spalten umwandeln

n00b67

Newbie
Registriert
März 2009
Beiträge
5
[GELÖST] Zeilen in Spalten umwandeln

Hallöchen,

ich habe folgendes Problem: ich möchte aus einer Access-Tabelle mit x mal y Zeilen eine (neue) Tabelle mit x Zeilen und y Spalten machen.

Quell-Tabelle (Auszug):

Code:
  Messzyklus  |  Messung  |  Messwert  
--------------+-----------+------------------
           1  |        1  |      100.2                    
           1  |        2  |      100.4
           1  |        3  |      100.6    
           2  |        1  |      101.3  
           2  |        2  |      101.5
           2  |        3  |      101.7    
         ...  |      ...  |        ...

Ziel-Tabelle:

Code:
  Messzyklus  |  Messwert1  |  Messwert2  |  Messwert3  
--------------+-------------+-------------+---------------
           1  |     100.2   |     100.4   |     100.6   
           2  |     101.3   |     101.5   |     101.7   
         ...  |       ...   |       ...   |       ...

Die Anzahl der Messungen pro Messzyklus ist konstant (im o.g. Beispiel = 3), die Anzahl der Messzyklen ist dynamisch.


Hat jemand eine Idee wie man das in SQL und/oder VBA realisieren kann ?

Gruß,
n00b67
 
Zuletzt bearbeitet:
Tabelle markieren, kopieren. Rechtsklick wo die Tabelle hinkopiert werden soll "Inhalte einfügen" und Hacken bei transponieren setzen.
 
@keren: danke für die schnelle Antwort.

Ich hätte wohl erwähnen sollen, dass die Umwandlung automatisch (sprich: per SQL/VB/VBA-Code) erfolgen soll...:rolleyes:
 
[SOLVED]: Zeilen in Spalten umwandeln

Ich habe die Lösung gefunden:

Code:
TRANSFORM First(Tabelle1.Messwert) AS [Messwert]
SELECT Messzyklus
FROM Tabelle1
GROUP BY Messzyklus
PIVOT "Messwert" & Messung;

thx
 
Hallo n00b67,
du hast hier einen typischen Fall für eine Kreuztabelle (Pivotierung).
Ich orientiere mich an deinem Beispiel. Die Tabelle heisst in meinem Fall auch "Tabelle".
1. erst musst du mit "case when" die einzelnen Zeilen "rausfiltern" und
2. diese dann mit "sum()" und "group by" komprimieren.
Ich habe beide Schritte in einer Abfrage gleichzeitig angewendet.
Dieses erlädigt man auf folgende Art und Weise:

Code:
select
  Messzyklus,
  sum(case when Messung = 1 then Messwert else 0 end) as Messwert1,
  sum(case when Messung = 2 then Messwert else 0 end) as Messwert2,
  sum(case when Messung = 3 then Messwert else 0 end) as Messwert3
from
  Tabelle
group by
  Messzyklus

Dies sieht auf den ersten Blick eventuell abschreckend aus ist es aber garnicht :)

Hoffe dir damit geholfen zu haben...

Gruß

dlitau
 
@dlitau: danke für die Antwort, es ist wohl so dass Access 2003 kein "case when" kennt (Fehlermeldung).

alternativ geht unter Access die folgende Abwandlung deines Codes:

Code:
select
  Messzyklus,
  sum(IIF(Messung = 1, Messwert, 0)) as Messwert1,
  sum(IIF(Messung = 2, Messwert, 0)) as Messwert2,
  sum(IIF(Messung = 3, Messwert, 0)) as Messwert3
from
  Tabelle1
group by
  Messzyklus;

:)
 
Die Zieltabelle ist ein gutes Beispiel, wie ein Datenbankdesign nicht aussehen sollte. Ich hoffe du hast einen guten Grund, warum es ausgerechnet so aussehen soll.
 
Wieso? Auch wenn du allgemein natürlich recht hast, ist es absolut legitim eine Tabelle so aufzubauen, wenn es in jedem Fall immer exakt 3 Messwerte gibt - nicht mehr und nicht weniger.
 
Ich habe fast das gleiche Problem.
Allerdings fehlt in meiner Tabelle die Spalte Messung.
Sie ist praktisch aufgebaut wie folgt

Messzyklus Messwert
------------------------------------------
1 100
1 102
1 105
2 90
2 106
3 .......
3
3
3
3

Es gibt pro Messzyklus 1 - max.5 Messwerte.
wieviele steht leider nicht in der Tabelle.
Die Anzahl der Messwerte pro Messzyklus ergibt sich praktisch aus der Anzahl der Zeilen wo der Messzyklus identisch ist.
Ich benötige also 5 Spalten mit Messwerte 1-5 in der Tabelle. Wenn ein Messzyklus zB nur 3 Werte hat, soll die spalte 4 und 5 mit 0 gefüllt werden.
Ich habe leider keine Idee mehr.
 
Zurück
Oben