webForumDet fria alternativet

Få ut kolumnnamnet för när viss data inte är null

Databaser & SQL

3 svar · 343 visningar · startad av Minna

Medlem sedan juli 20096 inlägg
Frågan#1

Jag vill via en sql-query få ut columnnamnet när datat för en viss specifik rad inte är "null"

dvs jag har följande tabell:

id, PETER , LARS, ANDERS, MONA, KALLE
1, 1000, null, null, 200, null
2, 200, null, null, null, 300
3, null, 300, null, 400, 100
4, null 1050, null, null, null
5 null, null, 400, null, null
...

När jag väljer att söka efter id=1 så vill jag få ut "PETER" och "LARS". När jag söker på id=2 vill jag få ut "PETER" och "KALLE" osv.

Medlem sedan feb. 20034 441 inlägg
#2

Jag hade nog haft en egen tabell med alla användare istället och sen ha med "user_id" tillsammans med beloppen.

Blir nog lite lättare, samtidigt som du enkelt kan bygga ut med flera användare vid behov.

Medlem sedan aug. 20039 340 inlägg
#3

Håller med föregående talare. Men ifall att du bara exemplifierade så kan jag peka hitåt: http://www.webforum.nu/showthread.php?t=175216
Om din databasmotor stödjer det (SQL Server 2005 eller Oracle) så kan du använda dig av "unpivot". Annars kan du t ex använda dig av en hög med UNIONs. Så här borde koden bli för ditt problem:

(SELECT id AS id, 'PETER' AS columnname, PETER AS value FROM tabellnamn WHERE id = 2 AND PETER IS NOT NULL)
UNION ALL
(SELECT id AS id, 'LARS' AS columnname, LARS AS value FROM tabellnamn WHERE id = 2 AND LARS IS NOT NULL)
UNION ALL
(SELECT id AS id, 'ANDERS' AS columnname, ANDERS AS value FROM tabellnamn WHERE id = 2 AND ANDERS IS NOT NULL)
UNION ALL
(SELECT id AS id, 'MONA' AS columnname, MONA AS value FROM tabellnamn WHERE id = 2 AND MONA IS NOT NULL)
UNION ALL
(SELECT id AS id, 'KALLE' AS columnname, KALLE AS value FROM tabellnamn WHERE id = 2 AND KALLE IS NOT NULL)

Det som MickeA föreslår är att du istället ska lagra datat i två tabeller, en för namnen och en för poängen (eller vad det nu är)

[b]users[/b]
user_id	name
1	PETER
2	LARS
3	ANDERS
4	MONA
5	KALLE

[b]points[/b]
user_id	points	round_id
1	1000	1	--Peter
4	2000	1	--Mona
1	200	2	--Peter
5	300	2	--Kalle

...osv

Sedan kan du plocka ut data med en fråga i stil med:

SELECT u.name AS name
  FROM points p
  JOIN users u ON u.user_id = p.user_id
 WHERE p.round_id = 2

Självklart kan du även beräkna summa och annat rätt så enkelt.

Medlem sedan juli 20096 inlägg
#4

Tack, ska kika på det!

260 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
129 ms — deklarationer (db)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)