(Moderator)
Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
Delphi 2007 Enterprise
|
Re: SQL: von Zeilendarstellung in Spaltendarstellung
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 = 'Feiertag' then 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")
|
|
Zitat
|