Einzelnen Beitrag anzeigen

alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: SQL: von Zeilendarstellung in Spaltendarstellung

  Alt 5. Jun 2009, 23:24
Ich hab auch einen:
SQL-Code:
Select Name,
       Sum (Case when U.Abwesenheitsgrund = 'Urlaub'   then 1 else 0 end) as 'Urlaub',
       Sum (Case when U.Abwesenheitsgrund = 'Krank'    then 1 else 0 end) as 'Krank',
       Sum (Case when U.Abwesenheitsgrund = 'Seminar'  then 1 else 0 end) as 'Seminar',
       Sum (Case when U.Abwesenheitsgrund = 'Feiertagthen 1 else 0 end) as 'Feiertag'
From Tabelle
  Group by Name
Dynamische Erzeugung:
SQL-Code:
create procedure CreatePivotTable
        @TableName VarChar(80),
   @GroupField VarChar(80),
   @PivotField VarChar(80)
as
declare @SelectCmd VarChar(8000), @PivotElement VarChar(80)
--
-- 1. Alle Spaltennamen erzeugen
create table #fields (elements varchar(80))
execute('insert into #fields select distinct '+ @PivotField+' from '+@TableName)

--
-- 2. SELECT Befehl erzeugen
set @SelectCmd = 'select '+@GroupField
declare C cursor for select * from #fields
  
open C
fetch next from C into @PivotElement
while (@@fetch_status = 0) begin
  set @SelectCmd = @SelectCmd + ','+Char(13)+char(10)+
     ' Sum(case when '+@PivotField+' = '''+@PivotElement+''' then 1 else 0 end) as '+@PivotElement
  fetch next from C into @PivotElement
end
close C
deallocate C
drop table #fields
set @SelectCmd = @SelectCmd + Char(13)+char(10)+'from '+@TableName
+ Char(13)+char(10)+'Group by '+@GroupField

print @SelectCmd -- <<---- Testausgabe
execute (@SelectCmd)
Ausführung durch
exec CreatePivotTable 'tabelle','Name','Abwesenheitsgrund' Ist leider nicht ganz so allgemeingültig, sonder basiert auf der Annahme, das das @PivotField ein String ist. Das könnte man noch optimieren
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat