MSSQL und Pivot Spalte

LauraM

Ensign
Registriert
Nov. 2019
Beiträge
133
Hallo ,
ich habe eine Tabelle
Code:
 id | colour
----+------------
  1 | a, b
  2 | a, c
  3 | d, f, v

Ich möchte die Spalte color teilen, ist gemeint, wenn mehr als ein Eintrag, soll eine neue Spalte entstehen. Ich versuche es mit IIRC Funktion:

Code:
select id, colour
from tab1
pivot (colour)

Aber leider es funktioniert nicht, könnte mir jemand sagen, wie es gehen sollte? Ich habe gegoogelt, viele Beispiele sind da, aber kann ich zu meinem nicht nutzen bzw. bin ich zu doof dafür.
vG
Laura
 
Wie wär's einfach ganz klassisch hiermit?

Code:
id | colour
---+------------
1 | a
1 | b
2 | a
2 | c
3 | d
3 | f
3 | v

id + colour wären dann ein Composite Index. Kommt natürlich darauf an, was du machen willst. Vielleicht ist auch ein zusätzlicher Auto Increment Index nützlich. Oder teilweise Auslagerung der Daten in eine zweite Tabelle.
 
Was willst du denn abfragen / erreichen?
 
In der Abfrage möchte ich folgendes erreichen:
Code:
id | colour1  colour2      colour3
----+--------------------------------------
  1 | a         b          null
  2 | a         c          null
  3 | d         f            v

An sich ist das gleiche, wie erste Beitrag, aber ich möchte mit getrennten Spalten.
 
Zuletzt bearbeitet:
Du hast Recht,es gibt viele Beispiele und ich mache aufgrund von deinem Beispiel:
Code:
select * from
(select id, colour
from tab) src
pivot
(avg (???

Und hier ist für mich Ende, da ich nur 2 Spalten habe und das Problem ist, dass ich nicht verstehe wie ich das machen kann. Ich bin k Informatiker, aber versuche ich ans Ziel zu kommen.
Ich werde sehr dankbar, wenn du mir vielleicht ein Tipps gibst, danke


Vielleicht das was ich machen möchte, heiss keine Pivot Spalte. aber an sich weiss du, was ich machen möchte? Geht das überhaupt?

Deswegen habe ich gedacht, dass aus der Tabelle in meinem ersten Beitrag könnte man extra Spalten erstellen.
 
Zuletzt bearbeitet:
wenn du die Anzahl der Spalten im vorraus nicht kennst, dann brauchst du dynamisches SQL.
 
Aber kann ich einfach max 15 Spalten deklarieren.
Ich denke gibt es laut was ich hier habe 12, aber es kann sein dass ich mich irre.

Wie mache ich das bitte?

Och habe mit substring_index probiert, aber das geht nicht by mssql.

Ich werde sehr dankbar, wenn mir jemand hier hilft.

Ich habe hier versucht, aber die Fkt min ist falsch:

Code:
select * from tab
pivot (min(colour) for colour in ([Z1],[Z2],[Z3])) as Sortierung
 
Zuletzt bearbeitet:
Guten Morgen,
zu meine Fragen gestermn, kann mir jemand noch hier bitte helfen?

Ich habe so eine Abfrage gemacht:
Code:
select id,SUBSTRING(colour,0,charindex(',',colour))as colour1
,SUBSTRING(colour,charindex(',',keyword),len(keyword)+1)as colour2 
,SUBSTRING(colour,charindex(',',keyword),len(keyword)+1)as colour3 
,SUBSTRING(colour,charindex(',',keyword),len(keyword)+1)as colour4 
,SUBSTRING(colour,charindex(',',keyword),len(keyword)+1)as colour5 
from tab

Die Abfrage funktioniert, aber nicht ganz.
Sie Teilt mir erste 2 Wörter, der rest bleibt hängen in der 2 Spalte. Also wenn mehr als 2 Wörter im feld, dann erste Wort ist in 1. Splate , aber 2, 3 Wort ist in 2. Spalte, was falsch ist. Ich weiß es nicht, wie kann ich es ändern.

Ich bitte ganz toll um einen Feddback.
Danke
 
Zuletzt bearbeitet:
Dass du immer die gleiche Operation fuer colour2 bis colour5 ausfuehrst merkst du nicht? Verstehst du warum das nicht geht? Bitte mal erklaeren was z.B. bei

SQL:
SUBSTRING(colour,charindex(',',keyword),len(keyword)+1)as colour2,
SUBSTRING(colour,charindex(',',keyword),len(keyword)+1)as colour3
deiner Meinung nach passieren soll.

Dass das ganze hard-codiert ist und damit eh sinnlos, geschenkt ... den Hinweis dynamische SQL hab ich schon gegeben.
 
Zuletzt bearbeitet:
Hi, mit dynamische SQL und Fkt kenne mich überhaupt nicht aus.
Bei meine Code ist Fehler, da an sich das 2. substring sollte auf erste Substring aufgebaut werden usw. aber leider kann ich das nicht. Alle meine Proben zeigen falsche Ergebnis.
Ich muss ehrlich sagen, ich suche eine Lösung. Ich habe was gebaut, mein Fehler erkannt und möchte gerne eine Korrektur.

viele Grüße L.
 
LauraM schrieb:
Bei meine Code ist Fehler, da an sich das 2. substring sollte auf erste Substring aufgebaut werden usw. aber leider kann ich das nicht.
Ja ... SQL ist keine Programmiersprache ...

Ich sag mal so, du bist nicht die erste Person, die das versucht:
https://stackoverflow.com/questions/10581772/how-to-split-a-comma-separated-value-to-columns

Such dir dort eine Lösung aus, "viele Wege ... " - nimm split + pivot, oder schreib eine Function wie in der akzeptierten Antwort dort, oder ...
 
Guten Morgen,
vielen Dank für eure Antworte!
Der Tip für das Substring habe ich auch schon von dieser Seite https://stackoverflow.com/questions/10581772/how-to-split-a-comma-separated-value-to-columns genommen.
Nun dort sind nur 2 Wöter, ich habe mehr. Deshalb müssen die Substring aufeinander aufgebaut werden, aber ich weiss es leider nicht wie.
Könnte mir jemand es sagen? nur für 3 Substring, wie ich das aufbauen könnte. Den rest würde ich alleine versuchen.
Code:
select id,SUBSTRING(colour,0,charindex(',',colour))as colour1
,SUBSTRING(colour,charindex(',',keyword),len(keyword)+1)as colour2
,SUBSTRING(colour,charindex(',',keyword),len(keyword)+1)as colour3 -> ab hier muss was anderes
,SUBSTRING(colour,charindex(',',keyword),len(keyword)+1)as colour4
,SUBSTRING(colour,charindex(',',keyword),len(keyword)+1)as colour5
from tab

Viele Grüße
Laura
 
Hallo,
ich were sehr dankbar, wenn jemand mit mir hier spricht.
ich habe jetzt so eine Abfrage formuliert:
Code:
select id,
rtrim(CASE WHEN spalte LIKE '%,%' THEN left(spalte,charindex(',',spalte)-1) ELSE spalte END),
rtrim(CASE WHEN spalte LIKE '%,%' THEN right(spalte,datalength(spalte)-charindex(',',spalte)) ELSE NULL END),
rtrim(CASE WHEN spalte LIKE '%,%' THEN right(spalte,datalength(spalte)-charindex(',',spalte)) ELSE NULL END)

from tab

Allerdings bekomme ich Lösung:

idkeine Spaltennamekeine Spaltennamekeine Spaltenname
12aa,bnull

13
kk,l,mk,l,m

Und es soll sein:

idkeine Spaltennamekeine Spaltennamekeine Spaltenname
12abnull
13klm

Was muss in meine Abfrage korrigiert werden? Ich komme nicht drauf.

Danke!
 
Könnte mir bitte jamnd sagen, wie ich meine Abfrage korrigieren kann? Ich werde sehr dankbar.
 
Zurück
Oben