Dynamisches Pivot von Zeilen in Spalten

ny_unity

SQL-Guru
Beiträge
183
Guten Morgen,

ich stehe vor einem neuen Problem, weiß nicht so recht wie es lösen soll.

Gegeben ist eine Tabelle mit ID`s (Bewerber) mit Anlagedatum und Herkunft (also Kanal über den sich der Bewerber beworben hat). Ich möchte nun zählen, wie viele Bewerber sich über welchen Kanal in welchem Zeitraum sich beworben haben.

Mit einem einfachen Pivot wäre das sicher kein Problem, aber ich habe mehr als 100 Herkünfte, die stetig wachsen, daher wollte ich es gern dynamisch haben, aber genau dort hört mein Wissen auf.

Also im Moment sieht es so aus:

ID Zeitraum Herkunft
1 01.01.2020 Facebook
2 01.01.2020 Twitter
3 01.01.2020 Arbeitsamt
4 01.02.2020 Facebook

Wie ich es gerne hätte:

Zeitraum Facebook Twitter Arbeitsamt
01.01.2020 1 1 1
01.02.2020 1 0 0

Habt ihr eine Idee?

Danke,

Erik
 
Werbung:
Es gibt das Pivot Kommando auch in MS SQL. Aber es ist soweit ich weiß in keinem RBMS dynamisch. Du musst immer die Ergebnisspalten angeben, es nimmt Dir nur etwas von der Transformationsarbeit ab.
Es gibt da ca 2 Ansätze:
- Pivot entsprechend dem Bedarf erst in einem Report Generator zu machen, der das dann vielleicht etwas besser und dynamischer kann, hier habe ich aber keine praktischen Tipps / Tools für MS SQL
- Das SQL Statement für die Pivotisierung dynamisch zusammen bauen mit der jeweils gewünschten Spaltenauswahl
- den vorigen Vorschlag, SQL zu generieren , über dafür vorhandene Server Funktionen zu erledingen (weiß auch nicht, ob es die in MS SQL gibt)
- Nicht dynamisch zu sein, zumindest nicht in den Spaltennamen. Das bietet sich ganz gut an, wenn man z.B. für 12 (feste) Monate, Jan- Dez oder so Daten pivotiersiert. Das passt offensichtlich nicht so gut zu Deinem Anwendungsfall.
 
Grüße,

ich konnte mein Ziel erreichen, muss das ganze jetzt nur noch irgendwie als VIEW hinbekommen...

Code:
declare @col varchar(1000)
declare @sql varchar(2000)
select @col = COALESCE(@col + ', ','') + QUOTENAME(herkunft)
from beweber_log Group by herkunft
Set @sql='select * from (select CONVERT(varchar,DATEPART(YEAR,Anlagedatum)) + ''/'' + CASE WHEN DATEPART(MONTH,Anlagedatum) < 10 THEN ''0'' ELSE '''' END + CONVERT(varchar, DATEPART(MONTH,Anlagedatum)) AS zeitraum, herkunft, bewerber_id from beweber_log) src 
PIVOT (COUNT(bewerber_id) FOR herkunft
IN ('+@col+')) pvt'
EXEC(@sql)
 
Hat jemand eine Idee, wie ich meine stored prozedure als view oder temp tabelle ausgeben kann, ohne beim insert alle spalten angeben zu müssen?

also analog zu select * into #temp FROM stored_prozedure

?
 
Werbung:
ich habe es so gelöscht, das jede Stunde ein job läuft, der eine Tabelle erstellt und die vorhandene droppt, das reicht mir... die Werte werden eh nur stündlich aktualisiert.
 
Zurück
Oben