PIVOT-Frage (SQL Server 2005 SP3)

25/03/2009 - 18:55 von Gerald Aichholzer | Report spam
Hallo NG,

irgendwo stehe ich momentan auf der Leitung und benötige
eure Hilfe. Ich habe eine Tabelle zur Verwaltung von
Skalenwerten mit folgender Struktur:

CREATE TABLE [man].[ScaleValue](
[ScaleId] [int] NOT NULL,
[ScaleValueId] [int] NOT NULL,
[ScaleValueText] [nvarchar](255) NOT NULL,
CONSTRAINT [PK_ScaleValue] PRIMARY KEY CLUSTERED
(
[ScaleId] ASC,
[ScaleValueId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

Nun benötige ich in den Zeilen die ScaleId, in den Spalten
die ScaleValueId und am Kreuzungspunkt den jeweiligen Text:

select
ScaleId
,[0], [1], [2], [3], [4], [5], [6], [7], [8], [9]
,[10], [11], [12], [13], [14], [15], [16], [17], [18], [19]
from
man.ScaleValue
pivot (
max(ScaleValueText)
for ScaleValueId in (
[0], [1], [2], [3], [4], [5], [6], [7], [8], [9],
[10], [11], [12], [13], [14], [15], [16], [17], [18], [19]
)
) as p


Diese Abfrage funktioniert nur "teilweise", das Ergebnis sieht
in etwa so aus:

ScaleId 0 1 2 3 4 5
1 NULL eins NULL NULL NULL NULL
1 NULL NULL zwei NULL NULL NULL
1 NULL NULL NULL drei NULL NULL
2 NULL 14-19 20-29 20-39 40-49 ab 50
...

d.h. manche Skalen werden zu einer Zeile zusammengefasst, andere
wiederum erhalten für jeden Skalenwert eine eigene Zeile.

Warum ist das so bzw. wie muss ich den SQL-Befehl umformatieren,
damit ich pro Skala nur eine Zeile erhalte?

vielen Dank und schöne Grüße,
Gerald
 

Lesen sie die antworten

#1 Elmar Boye
25/03/2009 - 22:58 | Warnen spam
Hallo Gerald,

Gerald Aichholzer schrieb:
irgendwo stehe ich momentan auf der Leitung und benötige
eure Hilfe. Ich habe eine Tabelle zur Verwaltung von
Skalenwerten mit folgender Struktur:

CREATE TABLE [man].[ScaleValue](
[ScaleId] [int] NOT NULL,
[ScaleValueId] [int] NOT NULL,
[ScaleValueText] [nvarchar](255) NOT NULL,

Nun benötige ich in den Zeilen die ScaleId, in den Spalten
die ScaleValueId und am Kreuzungspunkt den jeweiligen Text:



Hier lese ich eine Diskrepanz ...


Warum ist das so bzw. wie muss ich den SQL-Befehl umformatieren,
damit ich pro Skala nur eine Zeile erhalte?



... zum hier beschrieben raus.

Bevor das geklàrt ist, mal drei Varianten, die mir eingefallen sind,
ohne Tabelle oder Abfrage zu àndern, nur anhand eines geànderten
Primàrschlüssel-Zuordnung.

Dazu jeweils einen Abschnitt freischalten und den Rest auskommentieren -
vorher Tabelle löschen (TRUNCATE bzw. Neuanlage):


INSERT INTO ScaleValue (ScaleId, ScaleValueId, ScaleValueText)
/*
ScaleId 0 1 2 3 4 5
1 NULL eins NULL NULL NULL NULL
2 NULL 14-19 20-29 20-39 40-49 ab 50
*/
SELECT 1, 1, 'eins'
UNION ALL SELECT 1, 2, 'zwei'
UNION ALL SELECT 1, 3, 'drei'
UNION ALL SELECT 2, 1, '14-15'
UNION ALL SELECT 2, 2, '20-29'
UNION ALL SELECT 2, 3, '40-49'
UNION ALL SELECT 2, 4, 'ab 50'

/*
ScaleId 0 1 2 3
0 NULL eins zwei drei
1 14-19 NULL NULL NULL
2 20-29 NULL NULL NULL
3 30-39 NULL NULL NULL
4 40-49 NULL NULL NULL
5 ab 50 NULL NULL NULL
*/
/*
SELECT 0, 1, 'eins'
UNION ALL SELECT 0, 2, 'zwei'
UNION ALL SELECT 0, 3, 'drei'
UNION ALL SELECT 1, 0, '14-15'
UNION ALL SELECT 2, 0, '20-29'
UNION ALL SELECT 3, 0, '30-39'
UNION ALL SELECT 4, 0, '40-49'
UNION ALL SELECT 5, 0, 'ab 50'
*/

/*
ScaleId 0 1 2 3 4 5
0 NULL eins zwei drei NULL NULL
1 NULL 14-19 NULL NULL NULL NULL
2 NULL NULL 20-29 NULL NULL NULL
3 NULL NULL NULL 30-39 NULL NULL
4 NULL NULL NULL NULL 40-49 NULL
5 NULL NULL NULL NULL NULL ab 50
*/
/*
SELECT 0, 1, 'eins'
UNION ALL SELECT 0, 2, 'zwei'
UNION ALL SELECT 0, 3, 'drei'
UNION ALL SELECT 1, 1, '14-15'
UNION ALL SELECT 2, 2, '20-29'
UNION ALL SELECT 3, 3, '30-39'
UNION ALL SELECT 4, 4, '40-49'
UNION ALL SELECT 5, 5, 'ab 50'
*/
GO

Gruß Elmar

Ähnliche fragen