Christoph Muthmann
Architektur und Administration
Architektur und Administration
Okt 17th
Gelegentlich stellt sich die Frage, wie man mehrere unterschiedliche PIVOT-Ergebnisse in einer Liste darstellen kann. In diesem Beispiel wird der Name der Pivot-Spalte als Konstante mit in die Ergebnissmenge genommen und ein UNION ALL über alle PIVOT-Zeilen durchgeführt.
In diesem Beitrag hatte ich ein ähnliches Beispiel zum Join von Ergebnissen beschrieben.
Set Nocount on
go
CREATE TABLE #p
( Name varchar(10),
ErfüllungsgradIst INTEGER,
ErfüllungsgradSoll INTEGER,
Maschine varchar(20) )
GO
INSERT INTO #p VALUES ('Maier', 3, 4, 'Drehbank')
INSERT INTO #p VALUES ('Maier', 2, 3, 'Fräsmaschine')
INSERT INTO #p VALUES ('Maier', 4, 4, 'Bohrmaschine')
INSERT INTO #p VALUES ('Huber', 1, 2, 'Drehbank')
INSERT INTO #p VALUES ('Huber', 2, 3, 'Fräsmaschine')
select *
from #p
Select Name, 'ErfüllungsgradSoll' as Erfüllungsgrad, coalesce(Drehbank, 0) as Drehbank,
coalesce(Fräsmaschine, 0) as Fräsmaschine, coalesce(Bohrmaschine, 0) as Bohrmaschine
from
(Select Name, ErfüllungsgradSoll , Maschine from #p) as SourceTable
PIVOT
(
min(ErfüllungsgradSoll)
FOR Maschine IN ( [Drehbank],[Fräsmaschine], [Bohrmaschine])
) as PivotTable
Union ALL
Select Name, 'ErfüllungsgradIst', coalesce(Drehbank,0), coalesce(Fräsmaschine,0), coalesce(Bohrmaschine, 0)
from
(Select Name, ErfüllungsgradIst, Maschine from #p) as SourceTable
PIVOT
(
min(ErfüllungsgradIst)
FOR Maschine IN ( [Drehbank],[Fräsmaschine], [Bohrmaschine])
) as PivotTable
Order By Name, Erfüllungsgrad
GO
drop Table #p
Mär 14th
Der PIVOT-Operator bietet diese Funktionalität nur für eine Spalte. Wenn man mehrere PIVOT-Ergebnisse in einem Resultset haben möchte, kann man dies durch einen Join der beiden PIVOTs erreichen.
Set Nocount on go CREATE TABLE #p ( Year SMALLINT, Quarter TINYINT, Amount DECIMAL(2,1) ) GO INSERT INTO #p VALUES (1990, 1, 1.1) INSERT INTO #p VALUES (1990, 2, 1.2) INSERT INTO #p VALUES (1990, 3, 1.3) INSERT INTO #p VALUES (1990, 4, 1.4) INSERT INTO #p VALUES (1991, 1, 2.1) INSERT INTO #p VALUES (1991, 2, 2.2) INSERT INTO #p VALUES (1991, 3, 2.3) INSERT INTO #p VALUES (1991, 4, 2.4) GO -- Ohne schöne Spaltenüberschrift select a.year, a.[1], a.[2], a.[3], a.[4], b.[1], b.[2], b.[3], b.[4] from (SELECT * FROM #p PIVOT (sum(Amount) FOR Quarter IN ( [1],[2],[3],[4] )) as x) a, (SELECT * FROM #p PIVOT (count(Amount) FOR Quarter IN ( [1],[2],[3],[4] )) as y) b where a.year = b.year GO -- Mit schöner Spaltenüberschrift select a.year, a.Q1, a.Q2, a.Q3, a.Q4, b.Count_Q1, b.Count_Q2, b.Count_Q3, b.Count_Q4 from (SELECT year, [1] AS Q1,[2] AS Q2,[3] AS Q3, [4] AS Q4 FROM (SELECT * FROM #p) AS #p PIVOT (sum(#p.Amount) FOR #p.Quarter IN ( [1],[2],[3],[4] ) ) AS x) a, (SELECT year, [1] AS Count_Q1,[2] AS Count_Q2,[3] AS Count_Q3, [4] AS Count_Q4 FROM (SELECT * FROM #p) AS #p PIVOT (count(#p.Amount) FOR #p.Quarter IN ( [1],[2],[3],[4] ) ) AS x) b where a.year = b.year go drop Table #p