# Newbie braucht Hilfe beim Verstehen

**URL:** <https://www.pg-forum.de/t/newbie-braucht-hilfe-beim-verstehen/11987>\
**Category:** SQL\
**Created:** [24. Juni 2020 um 16:34 UTC](https://www.pg-forum.de/t/newbie-braucht-hilfe-beim-verstehen/11987 "2020-06-24T16:34:37Z")\
**Posts on this page:** 10\
**Page:** 1

<div class="post-metadata">

**Author:** ![Andres](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/a/a4c791/32.png) [@Andres](https://www.pg-forum.de/u/Andres)\
**Post date:** [24. Juni 2020 um 16:34 UTC](https://www.pg-forum.de/t/newbie-braucht-hilfe-beim-verstehen/11987/1 "2020-06-24T16:34:37Z")

</div>

Hallo,

ich muss für einen kranken Kollegen ein Skript ändern, dessen SQL Aufruf nicht verstehe.  
Das letzte mal, dass ich SQL genutzt habe dürfte um 2003 gewesen sein, wo ich recht simple Aufrufe genutzt habe (Select, Update, Insert)

Eingebettet ist das ganze in ein Shellskript (Bash). Meine Unix Tage sind auch schon etwas her, aber grundsätzliche verstehe ich was das Skript selber macht.

An dem SQL Teil beiße ich mir aber jetzt schon seit 2 Tagen die Zähne aus. Es werden eine Menge Befehle genutzt, die ich einzeln verstehe, wie z.B. Concat, aber in seiner Zusammensetzung verstehe ich es nicht.

```
echo "column TREFFER format A1000" >> $SQL_SCRIPT

   echo "select " >> $SQL_SCRIPT

   echo "WMSYS.WM_CONCAT(distinct 'TREFFER='||wf.SUBMIT_DATE||'|'||wf.form_id||'|'||wf.SITEKEY)||'|'||" >> $SQL_SCRIPT
   echo "WMSYS.WM_CONCAT(CASE WHEN PKEY='gender' THEN PVALUE END)||'|'||" >> $SQL_SCRIPT
   echo "WMSYS.WM_CONCAT(CASE WHEN PKEY='givenname' THEN PVALUE END)||'|'||" >> $SQL_SCRIPT       

```

echo “WMSYS.WM\_CONCAT(CASE WHEN PKEY=‘surname’ THEN PVALUE END)||’|’||” \>\> $SQL\_SCRIPT  
echo “WMSYS.WM\_CONCAT(CASE WHEN PKEY=‘email’ THEN PVALUE END)||’|’||” \>\> $SQL\_SCRIPT  
echo “WMSYS.WM\_CONCAT(CASE WHEN PKEY=‘customercode’ THEN PVALUE END)||’|’||” \>\> $SQL\_SCRIPT  
echo “WMSYS.WM\_CONCAT(CASE WHEN PKEY=‘company\_ku’ THEN PVALUE END)||’|’||” \>\> $SQL\_SCRIPT  
echo “WMSYS.WM\_CONCAT(CASE WHEN PKEY=‘reference\_number’ THEN PVALUE END)||’|’||” \>\> $SQL\_SCRIPT  
echo “WMSYS.WM\_CONCAT(CASE WHEN PKEY=‘training\_id’ THEN PVALUE END)||’|’||” \>\> $SQL\_SCRIPT  
echo “WMSYS.WM\_CONCAT(CASE WHEN PKEY=‘seminar\_title’ THEN PVALUE END)||’|’||” \>\> $SQL\_SCRIPT  
echo “WMSYS.WM\_CONCAT(CASE WHEN PKEY=‘seminar\_place’ THEN PVALUE END)||’|’||” \>\> $SQL\_SCRIPT  
echo “WMSYS.WM\_CONCAT(CASE WHEN PKEY=‘datum\_start’ THEN PVALUE END)||’|’||” \>\> $SQL\_SCRIPT  
echo “WMSYS.WM\_CONCAT(CASE WHEN PKEY=‘datum\_end’ THEN PVALUE END)||’|’||” \>\> $SQL\_SCRIPT  
echo “WMSYS.WM\_CONCAT(CASE WHEN PKEY=‘targetGroup’ THEN PVALUE END)||’|’||” \>\> $SQL\_SCRIPT  
echo "WMSYS.WM\_CONCAT(CASE WHEN PKEY=‘contentUri’ THEN PVALUE END)||’|’ as TREFFER " \>\> $SQL\_SCRIPT

```
   echo "from m_webform_data wfd1 " >> $SQL_SCRIPT
   echo "JOIN M_WEBFORM wf ON wfd1.form_id = wf.form_id" >> $SQL_SCRIPT
   echo "AND wf.NAME = 'CM9_training_registration_WSD'" >> $SQL_SCRIPT
   echo "group by wfd1.FORM_ID order by wfd1.FORM_ID;" >> $SQL_SCRIPT

```

Ich habe versucht die einzelnen Teile in ein SQL Statement umzuwandeln um mehr durchblick zu bekommen, bin aber völlig überfordert und finde keinen Punkt wo ich ansetzten kann.  
Um ehrlich zu sein, weiß ich nicht mal wie ich erklären kann woran ich scheitere… 😒

Mit den besten Grüßen,  
Andrés

---

<div class="post-metadata">

**Author:** ![Gisman](https://www.pg-forum.de/user_avatar/www.pg-forum.de/gisman/32/252_2.png) [@Gisman](https://www.pg-forum.de/u/Gisman)\
**Post date:** [24. Juni 2020 um 19:13 UTC](https://www.pg-forum.de/t/newbie-braucht-hilfe-beim-verstehen/11987/2 "2020-06-24T19:13:15Z")

</div>

Was steht denn in der Datei, die in $SQL\_SCRIPT hinterlegt ist?  
Da sollte das generierte SQL drin sein.

Gruß UWe

---

<div class="post-metadata">

**Author:** ![akretschmer](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/a/a6a055/32.png) [@akretschmer](https://www.pg-forum.de/u/akretschmer)\
**Post date:** [24. Juni 2020 um 19:17 UTC](https://www.pg-forum.de/t/newbie-braucht-hilfe-beim-verstehen/11987/3 "2020-06-24T19:17:36Z")

</div>

ich bekomme sowas in der Richtung:

```
column TREFFER format A1000
select 
WMSYS.WM_CONCAT(distinct 'TREFFER='||wf.SUBMIT_DATE||'|'||wf.form_id||'|'||wf.SITEKEY)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='gender' THEN PVALUE END)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='givenname' THEN PVALUE END)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY=‘surname’ THEN PVALUE END)||’|’||
WMSYS.WM_CONCAT(CASE WHEN PKEY=‘email’ THEN PVALUE END)||’|’||
WMSYS.WM_CONCAT(CASE WHEN PKEY=‘customercode’ THEN PVALUE END)||’|’||
WMSYS.WM_CONCAT(CASE WHEN PKEY=‘company_ku’ THEN PVALUE END)||’|’||
WMSYS.WM_CONCAT(CASE WHEN PKEY=‘reference_number’ THEN PVALUE END)||’|’||
WMSYS.WM_CONCAT(CASE WHEN PKEY=‘training_id’ THEN PVALUE END)||’|’||
WMSYS.WM_CONCAT(CASE WHEN PKEY=‘seminar_title’ THEN PVALUE END)||’|’||
WMSYS.WM_CONCAT(CASE WHEN PKEY=‘seminar_place’ THEN PVALUE END)||’|’||
WMSYS.WM_CONCAT(CASE WHEN PKEY=‘datum_start’ THEN PVALUE END)||’|’||
WMSYS.WM_CONCAT(CASE WHEN PKEY=‘datum_end’ THEN PVALUE END)||’|’||
WMSYS.WM_CONCAT(CASE WHEN PKEY=‘targetGroup’ THEN PVALUE END)||’|’||
WMSYS.WM_CONCAT(CASE WHEN PKEY=‘contentUri’ THEN PVALUE END)||’|’ as TREFFER 
from m_webform_data wfd1 
JOIN M_WEBFORM wf ON wfd1.form_id = wf.form_id
AND wf.NAME = 'CM9_training_registration_WSD'
group by wfd1.FORM_ID order by wfd1.FORM_ID;

```

das ist sicherlich nicht ganz korrekt, aber man kann erahnen, daß da eine simple Abfrage über 2 Tabellen (m\_webform\_data und M\_WEBFORM) zusammengefrickelt wird.

Allerdings finde ich WMSYS und WM\_CONCAT im Zusammenhang mit Oraggle.

---

<div class="post-metadata">

**Author:** ![Andres](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/a/a4c791/32.png) [@Andres](https://www.pg-forum.de/u/Andres)\
**Post date:** [24. Juni 2020 um 19:35 UTC](https://www.pg-forum.de/t/newbie-braucht-hilfe-beim-verstehen/11987/4 "2020-06-24T19:35:16Z")

</div>

```
column TREFFER format A1000
select
WMSYS.WM_CONCAT(distinct 'TREFFER='||wf.SUBMIT_DATE||'|'||wf.form_id||'|'||wf.SITEKEY)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='gender' THEN PVALUE END)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='form_country' THEN PVALUE END)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='form_language' THEN PVALUE END)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='camp' THEN PVALUE END)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='givenname' THEN PVALUE END)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='surname' THEN PVALUE END)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='company' THEN PVALUE END)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='street' THEN PVALUE END)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='housenr' THEN PVALUE END)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='postalcode' THEN PVALUE END)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='city' THEN PVALUE END)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='country' THEN PVALUE END)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='contact' THEN PVALUE END)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='email' THEN PVALUE END)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='phone' THEN PVALUE END)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='mail-when' THEN PVALUE END)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='phone-when' THEN PVALUE END)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='phone_mail_post_contact_allowed' THEN PVALUE END)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='help' THEN PVALUE END)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='materials' THEN PVALUE END)||'|'||
WMSYS.WM_CONCAT(CASE WHEN PKEY='message' THEN replace(replace(PVALUE,CHR(13),''),CHR(10),' ') END)||'|' as TREFFER
from m_webform_data wfd1
JOIN M_WEBFORM wf ON wfd1.form_id = wf.form_id
AND wf.NAME = 'form_de_de_sliding_systems_morethanaview_contact_consultation'
group by wfd1.FORM_ID order by wfd1.FORM_ID;
```

---

<div class="post-metadata">

**Author:** ![Andres](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/a/a4c791/32.png) [@Andres](https://www.pg-forum.de/u/Andres)\
**Post date:** [24. Juni 2020 um 19:49 UTC](https://www.pg-forum.de/t/newbie-braucht-hilfe-beim-verstehen/11987/5 "2020-06-24T19:49:48Z")

</div>

Ich denke eines meiner größeren Probleme ist, dass ich nicht verstehe was der Concat Befehl an der Stelle (mit dem Case) genau macht, oder was das Ergebnis sein sollte.  
Wenn ich auf “`select CONCAT(CASE WHEN PKEY='gender' THEN PVALUE END) from m_webform_data;`” verkürze bekomme ich einen Fehler.

Was WMSYS.WM vor dem Concat macht erschließt sich mir nicht und ich habe auf keiner Webseite eine Idee gefunden.

---

<div class="post-metadata">

**Author:** ![castorp](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/c/e99b99/32.png) [@castorp](https://www.pg-forum.de/u/castorp)\
**Post date:** [24. Juni 2020 um 20:26 UTC](https://www.pg-forum.de/t/newbie-braucht-hilfe-beim-verstehen/11987/6 "2020-06-24T20:26:13Z")

</div>

Das ist eine Abfrage für Oracle, nicht für Postgres.  
Willst Du die so umschreiben, dass sie mit Postgres läuft?

> Was WMSYS.WM vor dem Concat macht erschließt sich mir nicht

Das macht “vor dem” gar nichts.

Der Ausdruck `WMSYS.WM_CONCAT()` ruft die Funktion `wm_concat()` des Users `WMSYS` auf.

Das ist eine undokumentierte Funktion von Oracle und entspricht dem string\_agg() in Postgres - eine Aggregation die Strings verkettet.

D.h.

`WMSYS.WM_CONCAT(CASE WHEN PKEY='gender' THEN PVALUE END)` kann man in Postgres durch `string_agg(CASE WHEN PKEY='gender' THEN PVALUE END, ',')` ersetzen.

Wenn ich das richtig sehe, kann man das in Postgres so schreiben:

```sql
concat_ws('|', 
          string_agg(distinct 'TREFFER='||wf.SUBMIT_DATE||'|'||wf.form_id||'|'||wf.SITEKEY, ','),
          string_agg(CASE WHEN PKEY='gender' THEN PVALUE END, ','), 
          string_agg(CASE WHEN PKEY='form_country' THEN PVALUE END, ','),
          string_agg(CASE WHEN PKEY='form_language' THEN PVALUE END, ','),
          string_agg(CASE WHEN PKEY='camp' THEN PVALUE END, ','),
          string_agg(CASE WHEN PKEY='givenname' THEN PVALUE END, ','),
          string_agg(CASE WHEN PKEY='surname' THEN PVALUE END, ','),
          string_agg(CASE WHEN PKEY='company' THEN PVALUE END, ','),
          string_agg(CASE WHEN PKEY='street' THEN PVALUE END, ','),
          string_agg(CASE WHEN PKEY='housenr' THEN PVALUE END, ','),
          string_agg(CASE WHEN PKEY='postalcode' THEN PVALUE END, ','),
          string_agg(CASE WHEN PKEY='city' THEN PVALUE END, ','),
          string_agg(CASE WHEN PKEY='country' THEN PVALUE END, ','),
          string_agg(CASE WHEN PKEY='contact' THEN PVALUE END, ','),
          string_agg(CASE WHEN PKEY='email' THEN PVALUE END, ','),
          string_agg(CASE WHEN PKEY='phone' THEN PVALUE END, ','),
          string_agg(CASE WHEN PKEY='mail-when' THEN PVALUE END, ','),
          string_agg(CASE WHEN PKEY='phone-when' THEN PVALUE END, ','),
          string_agg(CASE WHEN PKEY='phone_mail_post_contact_allowed' THEN PVALUE END, ','),
          string_agg(CASE WHEN PKEY='help' THEN PVALUE END, ','),
          string_agg(CASE WHEN PKEY='materials' THEN PVALUE END, ','),
          string_agg(CASE WHEN PKEY='message' THEN replace(replace(PVALUE,CHR(13),''),CHR(10),' ') END)
         )

```

---

<div class="post-metadata">

**Author:** ![Andres](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/a/a4c791/32.png) [@Andres](https://www.pg-forum.de/u/Andres)\
**Post date:** [29. Juni 2020 um 07:06 UTC](https://www.pg-forum.de/t/newbie-braucht-hilfe-beim-verstehen/11987/7 "2020-06-29T07:06:38Z")

</div>

> [@castorp](#):
>

Hallo Castorp,

ich habe mich erst einmal damit auseinander gesetzt die Syntax des derzeitigen Aufrufes zu verstehen, da ich keine Datenbank Admin bin und wenig direkte Berührung habe.

Mittlerweile habe ich die Syntax so weit verstanden, auch wenn ich sie nicht selber von Scratch bauen könnte.

Zum Thema Postgres: Postgres ist doch eine Datenbank, oder? Zumindest suggeriert mir das eine Suche im Internet. Ich bin aber leider an Oracle gebunden.  
Oder kann ich den Aufruf auch bei Oralce nutzen?

Viele Grüße!

---

<div class="post-metadata">

**Author:** ![castorp](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/c/e99b99/32.png) [@castorp](https://www.pg-forum.de/u/castorp)\
**Post date:** [29. Juni 2020 um 07:18 UTC](https://www.pg-forum.de/t/newbie-braucht-hilfe-beim-verstehen/11987/8 "2020-06-29T07:18:22Z")

</div>

> [@Andres](#):
>
> Postgres ist doch eine Datenbank, oder?

Klar ist es das. Allerdings hat jede Datenbank ihren eigenen SQL Dialekt der zum Teil stark vom SQL Standard abweicht. Eine Abfrage die in System X läuft muss nicht notwendigerweise in System Y genauso laufen.

> [@](#):
>
> Ich bin aber leider an Oracle gebunden.

Wie Du an meinem Beispiel sehen kannst, ist die Postgres Syntax sehr unterschiedlich.

Wenn Du konkrete Hilfe zu Oracle suchst, dann bist Du hier leider an der falschen Stelle (wir helfen aber gerne bei Problemen mit der Migration von Oracle nach Postgres)

---

<div class="post-metadata">

**Author:** ![Andres](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/a/a4c791/32.png) [@Andres](https://www.pg-forum.de/u/Andres)\
**Post date:** [29. Juni 2020 um 11:19 UTC](https://www.pg-forum.de/t/newbie-braucht-hilfe-beim-verstehen/11987/9 "2020-06-29T11:19:35Z")

</div>

Hallo Castorp,

selbst wenn ihr Oracle nicht wirklich nutzt, habt ihr ihr dennoch enorm weitergeholfen.  
Ein Umstieg ist, derzeit, leider nicht geplant.

Beste Grüße,  
Andrés

---

<div class="post-metadata">

**Author:** ![system](https://www.pg-forum.de/uploads/default/original/1X/dc97a981dd26692d5fb52e8b8fc7c090d7b9559a.png) [@system](https://www.pg-forum.de/u/system)\
**Post date:** [21. Februar 2021 um 07:08 UTC](https://www.pg-forum.de/t/newbie-braucht-hilfe-beim-verstehen/11987/10 "2021-02-21T07:08:57Z")

</div>


