Zeilen als Spalte

Zeilen als Spalte

am 07.11.2007 11:21:05 von Stephan Menzel

Hallo,

ich habe schon etwas gesucht, aber noch keine zufriedenstellende
Antwort gefunden, für mein Problem!

Ich habe 2 Tabellen:

Tabelle 1

id Wert
1 Param1
2 Wert2
3 Value3
4 Wert4
.. .
.. .
.. .

Tabelle 2

Idx Wert_id Eigenschaft
001 3 56
001 4 Text1
002 1 P
002 2 N
002 4 Text2
.. . .
.. . .
.. . .

und brauche jetzt eine Abfrage die mir das ganze so Ausgibt

Idx Param1 Wert2 Value3 Wert4 . .
..
001 NULL NULL 56 Text1
002 P N NULL Text2
.. . . . .
.. . . . .
.. . . . .



cu Stephan

Re: Zeilen als Spalte

am 07.11.2007 11:40:07 von Andreas Kretschmer

Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de

Re: Zeilen als Spalte

am 07.11.2007 11:45:47 von Claus Reibenstein

Stephan Menzel schrieb:

> und brauche jetzt eine Abfrage die mir das ganze so Ausgibt
>
> Idx Param1 Wert2 Value3 Wert4 . .
> ..
> 001 NULL NULL 56 Text1
> 002 P N NULL Text2

Was spricht gegen SELECT?

Gruß. Claus

Re: Zeilen als Spalte

am 07.11.2007 13:57:16 von Stephan Menzel

Hallo,
>Stephan Menzel schrieb:
>
>> und brauche jetzt eine Abfrage die mir das ganze so Ausgibt
>>
>> Idx Param1 Wert2 Value3 Wert4 . .
>> ..
>> 001 NULL NULL 56 Text1
>> 002 P N NULL Text2
>
>Was spricht gegen SELECT?
Wie "Was spricht gegen SELECT"?
wie geht das deiner Meinung nach, wenn es so einfach ist?
>
>Gruß. Claus

cu Stephan

Re: Zeilen als Spalte

am 07.11.2007 14:00:42 von Stephan Menzel

Hallo,

>> Hallo,
>>
>> ich habe schon etwas gesucht, aber noch keine zufriedenstellende
>> Antwort gefunden, für mein Problem!
>>
>> Ich habe 2 Tabellen:
>>
>> Tabelle 1
>>
>> id Wert
>> 1 Param1
>>
>> Tabelle 2
>>
>> Idx Wert_id Eigenschaft
>> 001 3 56
>>
>> und brauche jetzt eine Abfrage die mir das ganze so Ausgibt
>>
>> Idx Param1 Wert2 Value3 Wert4 . .
>> .
>> 001 NULL NULL 56 Text1
>> 002 P N NULL Text2
>
>Wird so in plain SQL ned gehen. Dazu ist ja erst einmal Tabelle 1
>auszuwerten, um die Struktur der Zieltabelle zu erhalten. Man könnte das
>aber in einer stored proc machen, mit dynamischen SQL-Anweisungen. Für
>PG könnt ich das basteln, wäre aber für Dich wertlos. Aber vielleicht
>reichen Dir ja schon meine Hinweise, damit Du es selbst hinbekommst.
>


Das wollte ich eigentlich vermeiden, da ich noch ein Access-Frontend
dran habe, das mit dynamischen SQL nicht umgehen kann,
weill's Access nicht kann!
Besser gesagt der ODBC-Treiber kanns nicht!


cu Stephan

Re: Zeilen als Spalte

am 07.11.2007 14:24:07 von Claus Reibenstein

Stephan Menzel schrieb:

>> Stephan Menzel schrieb:
>>
>>> und brauche jetzt eine Abfrage die mir das ganze so Ausgibt
>>>
>>> Idx Param1 Wert2 Value3 Wert4 . .
>>> ..
>>> 001 NULL NULL 56 Text1
>>> 002 P N NULL Text2
>>
>> Was spricht gegen SELECT?
>
> Wie "Was spricht gegen SELECT"?
> wie geht das deiner Meinung nach, wenn es so einfach ist?

SELECT t2.Idx AS Idx, t1.Param1 as Param1, t1.Wert2 as Wert2, ...
FROM Tabelle1 AS t1, Tabelle2 AS t2
WHERE t1.id = t2.Wert_id

Du hast nicht geschrieben, wie die Tabellen vernküpft sind. Die
WHERE-Klausel ist daher nur geraten.

Gruß. Claus

Re: Zeilen als Spalte

am 07.11.2007 14:30:49 von Andreas Kretschmer

Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de

Re: Zeilen als Spalte

am 07.11.2007 14:39:57 von Stephan Menzel

Hallo,

>Stephan Menzel schrieb:
>
>>> Stephan Menzel schrieb:
>>>
>>>> und brauche jetzt eine Abfrage die mir das ganze so Ausgibt
>>>>
>>>> Idx Param1 Wert2 Value3 Wert4 . .
>>>> ..
>>>> 001 NULL NULL 56 Text1
>>>> 002 P N NULL Text2
>>>
>>> Was spricht gegen SELECT?
>>
>> Wie "Was spricht gegen SELECT"?
>> wie geht das deiner Meinung nach, wenn es so einfach ist?
>
>SELECT t2.Idx AS Idx, t1.Param1 as Param1, t1.Wert2 as Wert2, ...
> FROM Tabelle1 AS t1, Tabelle2 AS t2
> WHERE t1.id = t2.Wert_id

ich weiss nicht ob ich einen Denkfehler habe, aber t1.Param1usw, gibt
es doch gar nicht als spalte, wenn der SELECT so aussieht, wäre t1.id
bzw t1.Wert möglich! Ich wüsste nicht das ich so auch den Feldinhalt
mit t1.Param1 referenzieren kann!

>
>Du hast nicht geschrieben, wie die Tabellen vernküpft sind. Die
>WHERE-Klausel ist daher nur geraten.

Wert_id in Tabelle 2 bezieht sich auf id in Tabelle 1!

>
>Gruß. Claus

cu Stephan

Re: Zeilen als Spalte

am 07.11.2007 14:45:23 von Stephan Menzel

Hallo,

>begin Stephan Menzel schrieb:
>>>Wird so in plain SQL ned gehen. Dazu ist ja erst einmal Tabelle 1
>>>auszuwerten, um die Struktur der Zieltabelle zu erhalten. Man könnte das
>>>aber in einer stored proc machen, mit dynamischen SQL-Anweisungen. Für
>>>PG könnt ich das basteln, wäre aber für Dich wertlos. Aber vielleicht
>>>reichen Dir ja schon meine Hinweise, damit Du es selbst hinbekommst.
>>>
>>
>>
>> Das wollte ich eigentlich vermeiden, da ich noch ein Access-Frontend
>> dran habe, das mit dynamischen SQL nicht umgehen kann,
>> weill's Access nicht kann!
>> Besser gesagt der ODBC-Treiber kanns nicht!
>
>Ich bin ja nun nicht so vertraut mit MySQL und Access verkleistert mit
>ODBC, nur wenn ich das unter PG als Funktion schreiben würde, dann wäre
>es eine sog. SRF (Set Returning Function), der Aufruf wäre dann in etwa
>so:
>
>select * from my_srf_function();
>
>und würde dann eine Tabelle liefern. Quasi sowas:
>
>test=# create or replace function my_srf_function(OUT id int, OUT val1
>text) returns setof record as $$declare i int;begin for i in 1..5 loop
>id:=i;val1:='foo'||i; return next; end loop; end; $$language plpgsql;
>CREATE FUNCTION
>test=*# select * from my_srf_function();
> id | val1
>----+------
> 1 | foo1
> 2 | foo2
> 3 | foo3
> 4 | foo4
> 5 | foo5
>(5 rows)
>
>
>Natürlich mit sinnvollerem Body der Funktion ;-), also auslesen der
>Struktur, basteln eines dynamischen Select-Befehles (basierend auf der
>ersten abelle, welche die Spalten liefert und der zweiten mit den
>Daten), und das mit EXECUTE ausführen.
>
>Mmh, natürlich weiß man erst mal nicht, welche Spalten im Resultat sein
>werden, das erschwert das Ganze etwas. Dann also vielleicht als Resultat
>nur Text ausgeben und die Spalten schon alle formatiert wie gewünscht
>ausgeben. Nicht trivial, aber machbar.

das muss ich mir mal durch den Kopf gehen llassen, und am wochenende
Probieren was da raus kommt, hab nicht mehr so viel Zeit heut!

Danke für die Hinweisse!
>
>
>end
>Andreas

cu Stephan

Re: Zeilen als Spalte

am 07.11.2007 17:30:01 von Claus Reibenstein

Stephan Menzel schrieb:

> Hallo,
>
>> Stephan Menzel schrieb:
>>
>> SELECT t2.Idx AS Idx, t1.Param1 as Param1, t1.Wert2 as Wert2, ...
>> FROM Tabelle1 AS t1, Tabelle2 AS t2
>> WHERE t1.id = t2.Wert_id
>
> ich weiss nicht ob ich einen Denkfehler habe, aber t1.Param1usw, gibt
> es doch gar nicht als spalte, wenn der SELECT so aussieht, wäre t1.id
> bzw t1.Wert möglich!

Du hast natürlich Recht. Ich hatte Deine Tabellenangaben falsch
interpretiert und dachte, dies wären die Spaltennamen. Asche auf mein Haupt.

Gut, dann wird die Sache natürlich etwas komplizierter. Da muss ich erst
mal ein bisschen nachdenken. Wenn ich was habe, melde ich mich nochmal.

>> Du hast nicht geschrieben, wie die Tabellen vernküpft sind. Die
>> WHERE-Klausel ist daher nur geraten.
>
> Wert_id in Tabelle 2 bezieht sich auf id in Tabelle 1!

Gut, dann habe ich wenigstens das richtig :-)

Gruß. Claus

Re: Zeilen als Spalte

am 07.11.2007 23:34:00 von Andreas Sakowski

"Stephan Menzel" schrieb
> Hallo,
>
> ich habe schon etwas gesucht, aber noch keine zufriedenstellende
> Antwort gefunden, für mein Problem!
>
> Ich habe 2 Tabellen:
>
> Tabelle 1
>
> id Wert
> 1 Param1
> 2 Wert2
> 3 Value3
> 4 Wert4
> . .
> . .
> . .
>
> Tabelle 2
>
> Idx Wert_id Eigenschaft
> 001 3 56
> 001 4 Text1
> 002 1 P
> 002 2 N
> 002 4 Text2
> . . .
> . . .
> . . .
>
> und brauche jetzt eine Abfrage die mir das ganze so Ausgibt
>
> Idx Param1 Wert2 Value3 Wert4 . .
> .
> 001 NULL NULL 56 Text1
> 002 P N NULL Text2

select
b.idx
, b1.eigenschaft
, b2.eigenschaft
, b3.eigenschaft
, b4.eigenschaft
from b
left join b b1 on b1.idx = b.idx and b1.wert_id = 1
left join b b2 on b2.idx = b.idx and b2.wert_id = 2
left join b b3 on b3.idx = b.idx and b3.wert_id = 3
left join b b4 on b4.idx = b.idx and b4.wert_id = 4
group by
b.idx
, b1.eigenschaft
, b2.eigenschaft
, b3.eigenschaft
, b4.eigenschaft


könnte das sein, was Du suchst.

Gruß
Andreas

Re: Zeilen als Spalte

am 09.11.2007 15:34:46 von petsch

On 7 Nov., 23:34, "Andreas Sakowski" wrote:
>
> select [...]

Die vom OP mehrmals eingefügten . . . . .

deuten darauf hin, dass es nicht bei vier Werten und somit Spalten
bleibten wird. Ich schließe mich daher der ersten Antwort von Andreas
Kretschmer an. "Wird so in plain SQL ned gehen."

Auch wenn ich es vielleicht etwas weniger schwäbisch formuliert
hätte. :-)

Peter

Re: Zeilen als Spalte

am 09.11.2007 21:00:51 von Stephan Menzel

On Fri, 09 Nov 2007 06:34:46 -0800, petsch
wrote:

>On 7 Nov., 23:34, "Andreas Sakowski" wrote:
>>
>> select [...]
>
>Die vom OP mehrmals eingefügten . . . . .
>
>deuten darauf hin, dass es nicht bei vier Werten und somit Spalten
>bleibten wird.

so ist es, es sollte Dynamisch sein!

> Ich schließe mich daher der ersten Antwort von Andreas
>Kretschmer an. "Wird so in plain SQL ned gehen."
>
>Auch wenn ich es vielleicht etwas weniger schwäbisch formuliert
>hätte. :-)
>
>Peter

cu Stephan

Re: Zeilen als Spalte

am 10.11.2007 12:31:08 von dnoeth

Stephan Menzel wrote:

> ich habe schon etwas gesucht, aber noch keine zufriedenstellende
> Antwort gefunden, für mein Problem!

Du suchst nach den falschen Begriffen:
"Entity-Attribute-Value" oder "One true lookup table"
ist das wonach du suchst :-)

Und danach wirst du dir hoffentlich ein sinnvolles Datenmodell überlegen.

Auch sehr schön:
http://www.simple-talk.com/opinion/opinion-pieces/bad-carma/

Dieter