SQL - Ausgabe in Spalten

Trebjun

Grünschnabel
Hallo,

ich habe folgendes Problem:

angenommen ich mache folgende SQL Abfrage:

SELECT *
FROM tbl_autos

dann bekomme ich folgende Ausgabe

Audi
BMW
Mercedes
Porsche
...

Wie kann ich aber folgende Ausgabe umsetzen:

Audi BWM Mercedes Porsche ...

Ich möchte die Ausgaben also nicht in den Zeilen, sondern in den Spalten. Gibt es da eine einfache Möglichkeit?

Gruss,
Trebjun
 
Echt, das ist wirklich nicht möglich? Mein Problem lässt sich schwer beschreiben ... von daher wäre es toll, wenn das gehen würde.
 
Okay ...

also, ich habe in meiner Datenbank-Tabelle 6 Spalten: sagen wir mal (A,B,C,D,E,F),

A B C D E F
---------------------------------------------------------
... ... ... ... E.1 F.1
... ... ... ... E.2 F.2
... ... ... ... E.3 F.3
...


Nun soll ich einen Report daraus bauen, indem die ersten vier Spalten A-D normal ausgegben werden und die Spalte E nicht senkrecht, sondern waagerecht auch als Spalte. Spalte F wird dann in den Spalten von E angezeigt. Also so ungefähr ...

A B C D E.1 E.2 E.3 E.4 ...
----------------------------------------------------------------------------------
... ... ... ... F.1 F.2
... ... ... ... F.1
... ... ... ... F.3 F.2
... ... ... ... F.1 F.4
...

Ich hoffe das war jetzt einigermassen verständlich?!
 
Wie die Daten aus der Datenbank kommen ist doch egal, das Layout musst sowieso im Report-Generator festlegen?
 
Hallo,

erstmal DAS DATENBANKSYSTEM das Du benutzt ist WICHTIG !!

So, ansonsten ist Dein Zauberwort "transponieren": Wir brauchten das auch schon und machen das in Oracle so:

Simulierte Spalte (geht glaub ich auch in MySQL):
PHP:
SELECT TYPE 
FROM 
(
SELECT 'zeile1spalte1' AS TYPE FROM dual
UNION
SELECT 'zeile2spalte1' AS TYPE FROM dual
UNION 
SELECT 'zeile3spalte1' AS TYPE FROM dual
)
Ausgabe:
TYPE
---------
zeile1spalte1
zeile2spalte1
zeile3spalte1

jetzt die Funktion bauen (Beispiel ist für Oracle geeignet !!):

PHP:
PROMPT CREATE OR REPLACE FUNCTION rowtocol
CREATE OR REPLACE FUNCTION rowtocol( p_slct IN VARCHAR2,

     p_dlmtr IN VARCHAR2 DEFAULT ',' ) RETURN VARCHAR2

     AUTHID CURRENT_USER AS




--1) Column should be character type.
--2) If it is non-character type, column has to be converted into character type.
--3) If the returned rows should in a specified order, put that ORDER BY CLASS in the SELECT statement argument.
--4) If the SQL statement happened to return duplicate values, and if you don't want that to happen, put DISTINCT in the SELECT statement argument.



     TYPE c_refcur IS REF CURSOR;

     lc_str VARCHAR2(4000);

     lc_colval VARCHAR2(4000);

     c_dummy c_refcur;

     l number;


     BEGIN


     OPEN c_dummy FOR p_slct;



     LOOP

     FETCH c_dummy INTO lc_colval;

     EXIT WHEN c_dummy%NOTFOUND;

     lc_str := lc_str || p_dlmtr || lc_colval;

     END LOOP;

     CLOSE c_dummy;



     RETURN SUBSTR(lc_str,2);



     EXCEPTION

     WHEN OTHERS THEN



     lc_str := SQLERRM;

     IF c_dummy%ISOPEN THEN

     CLOSE c_dummy;

     END IF;

     RETURN lc_str;





     END;
/

Jetzt die Funktion verwenden:

PHP:
SELECT '1' AS Spalte , rowtocol(

' SELECT TYPE FROM 
(
SELECT ''zeile2spalte1'' AS TYPE FROM dual
UNION
SELECT ''zeile2spalte2'' AS TYPE FROM dual
UNION 
SELECT ''zeile2spalte3'' AS TYPE FROM dual
)'
, ' ;' )  zeile
FROM dual
Ausgabe:
SPALTE ZEILE
---------------------------------------------------------------------------
1 zeile1spalte1 ;zeile2spalte1 ;zeile3spalte1


Das ist der Werkzeugkasten mit dem Du (fast)alles lösen kannst.

Viel Spaß und sag bescheid obs geklappt hat.

Grüße
 
Hallo,

ich habe folgendes Problem:

angenommen ich mache folgende SQL Abfrage:

SELECT *
FROM tbl_autos

dann bekomme ich folgende Ausgabe

Audi
BMW
Mercedes
Porsche
...

Wie kann ich aber folgende Ausgabe umsetzen:

Audi BWM Mercedes Porsche ...

Ich möchte die Ausgaben also nicht in den Zeilen, sondern in den Spalten. Gibt es da eine einfache Möglichkeit?

Gruss,
Trebjun

- Welche DB ist es denn ?


Gruss
 
Hallo,

erstmal DAS DATENBANKSYSTEM das Du benutzt ist WICHTIG !!

So, ansonsten ist Dein Zauberwort "transponieren": Wir brauchten das auch schon und machen das in Oracle so:



Viel Spaß und sag bescheid obs geklappt hat.

Grüße

-Coole Lösung :)

...oder auch so :

CREATE OR REPLACE
TYPE myscalartype AS OBJECT (
job VARCHAR2 (30))
/

CREATE OR REPLACE
TYPE myarraytype AS TABLE OF myScalarType
/

SELECT CAST (MULTISET (SELECT job
FROM emp
GROUP BY job) AS myArrayType) x
FROM emp
/

(Basiert auf dem ScottTiger beispielschema...Falls der OP Oracle benutzt)
 
hey dbwizard,

die Lösung von Dir geht bei mir leider nicht, sieht ja genial einfach aus, ist die für Oracle 10g ?

Bekomme immer die Meldung: "The Query fails because all columns types are currently not supported" -> benutze Oracle 9.2i

Grüße
 

Neue Beiträge

Zurück