webForumDet fria alternativet

Expert sökes - knepiga nästlade select

6 svar · 386 visningar · startad av Janspeed

JanspeedMedlem sedan jan. 2001510 inlägg
#1

Har ett himla mystiskt problem med nästlade select.

Mitt mål är att få en tabell som ser ut så här:

Ort | Företag1 | Företag 2 | Företag 3 osv...
Uppsala | 1 | 2 | 1 osv...
Örebro | 2 | 0 | 1 osv...

Det löste jag med en nästlad select-sats som ser ut så här:

 
select distinct ort,
(select count(*) from tblForetag as ti where ty.ort = ti.ort and ti.Foretag = 'Foretag1') AS Foretag1, 
(select count(*) from tblForetag as ti where ty.ort = ti.ort and ti.Foretag LIKE '%Foretag2') AS [Foretag2], 
(select count(*) from tblForetag as ti where ty.ort = ti.ort and ti.Foretag = 'Foretag3') AS Foretag3, 
(select count(*) from tblForetag as ti where ty.ort = ti.ort and ti.Foretag = 'Foretag4') AS Foretag4, 
(select count(*) from tblForetag as ti where ty.ort = ti.ort and ti.Foretag = 'Foretag5') AS Foretag5, 
(select count(*) from tblForetag as ti where ty.ort = ti.ort and ti.Foretag = 'Foretag6') AS Foretag6, 
(select count(*) from tblForetag as ti where ty.ort = ti.ort and ti.Foretag = 'Foretag7') AS Foretag7, 
(select count(*) from tblForetag as ti where ty.ort = ti.ort and ti.Foretag = 'Foretag8') AS Foretag8 
from tblForetag as ty WHERE Foretag NOT LIKE 'Foretag9%' AND Gren NOT LIKE 'Underforetag%'

Mitt andra mål är att bara visa de orter som gäller för de enskilda företagen så jag tex. kan välja att bara se hur många företag som ligger på samma ort som Företag1.

Detta löste jag så här:

select distinct ort,
(select count(*) from tblForetag as ti where ty.ort = ti.ort and ti.Foretag = 'Foretag1') AS Foretag1, 
(select count(*) from tblForetag as ti where ty.ort = ti.ort and ti.Foretag LIKE '%Foretag2') AS [Foretag2], 
(select count(*) from tblForetag as ti where ty.ort = ti.ort and ti.Foretag = 'Foretag3') AS Foretag3, 
(select count(*) from tblForetag as ti where ty.ort = ti.ort and ti.Foretag = 'Foretag4') AS Foretag4, 
(select count(*) from tblForetag as ti where ty.ort = ti.ort and ti.Foretag = 'Foretag5') AS Foretag5, 
(select count(*) from tblForetag as ti where ty.ort = ti.ort and ti.Foretag = 'Foretag6') AS Foretag6, 
(select count(*) from tblForetag as ti where ty.ort = ti.ort and ti.Foretag = 'Foretag7') AS Foretag7, 
(select count(*) from tblForetag as ti where ty.ort = ti.ort and ti.Foretag = 'Foretag8') AS Foretag8 
from tblForetag as ty WHERE Foretag NOT LIKE 'Foretag9%' AND Gren NOT LIKE 'Underforetag%' [B]AND Foretag = 'Foretag1'[/B]

Detta funkade jättebra med både företag1 (AND Foretag = 'Foretag1' ) och Företag2 (AND Foretag LIKE '%Foretag2') men när jag väl kommer till företag3 så funkar det inte alls? Trots att det är nästan exakt samma kod och att det funkade i det första exemplet?

Skriver jag så här så funkar det:

SELECT * From tblForetag WHERE Foretag = 'Foretag3'

Men skriver jag så här så funkar det inte:

SELECT distinct ort,
(select count(*) from tblForetag as ti where ty.ort = ti.ort and ti.Foretag = 'Foretag3') AS Foretag3
FROM tblForetag as ty WHERE Foretag NOT LIKE 'Foretag9%' AND Gren NOT LIKE 'Underforetag%' AND Foretag = 'Foretag3'

Det känns ju som det måste vara knas med datat i databasen men jag kan inte hitta vad eller hur jag ska lösa det? Hoppas verkligen att någon kan hjälpa mig. Jag håller på att bli tokig. :(

LarsGMedlem sedan dec. 200012 464 inlägg
#2

Om du vill få fram hur många företag av en viss typ det finns på varje ort

SELECT ort,count(*) as foretag3
from  tblForetag
WHERE Gren NOT LIKE 'Underforetag%' 
  AND Foretag = 'Foretag3'
group by ort

Jag vet inte om jag har förstått vad du menar.

Men skriver jag så här så funkar det inte:

Vad menar du med funkar inte?

Det är alltid bra om du ger exempel på tabellinnehåll och förväntat resultat.

JanspeedMedlem sedan jan. 2001510 inlägg
#3

Ok, med "funkar inte" menar jag att satsen inte returnerar något resultat.

I mitt första exempel så funkar koden och satsen returnerar då alla orter och alla företag. Tabellen som returneras ser då ut nått sånt här:

Ort | Företag1 | Företag 2 | Företag 3 osv...
Uppsala | 1 | 2 | 1 osv...
Älmhult | 0 | 3 | 4 osv...
Örebro | 2 | 0 | 1 osv...

Det jag sen vill är att bara visa de orter där företag1 finns. Jag lägger då till satsen AND Foretag = 'Företag1' (se kodexempel 2). Det funkar också. Då blir resultatet:

Ort | Företag1 | Företag 2 | Företag 3 osv...
Uppsala | 1 | 2 | 1 osv...
Örebro | 2 | 0 | 1 osv...

Dvs. den exkluderar alla orter där det inte finns något företag1. Gör jag likadant fast med företag2 så funkar det också och resultatet blir så här:

Ort | Företag1 | Företag 2 | Företag 3 osv...
Uppsala | 1 | 2 | 1 osv...
Älmhult | 0 | 3 | 4 osv...

Mitt problem är att när jag försöker göra så med Företag3 så funkar det inte!? Och inte heller med de andra 8 efterföljande företagen i databasen? :/

Gör jag som i kodexempel 3 så returnerar det alla Företag3 men gör jag som i kodexempel 4 så returneras inget alls?

Jag fattar ingenting och jag har ingen aning om hur jag ska lösa det?

LarsGMedlem sedan dec. 200012 464 inlägg
#4

Då har väl alla företag av tyg företag3 .. företag8 värdet Underföretag i kolumnen gren.

I dina select count så har du inget villkor på gren.

JanspeedMedlem sedan jan. 2001510 inlägg
#5

Då har väl alla företag av tyg företag3 .. företag8 värdet Underföretag i kolumnen gren.

Det verkar som du är något på spåret! När jag inkluderar
AND (Gren NOT LIKE 'Underforetag%') i den vanliga select-satsen så returnerar den ingenting. :/

Typ så här:

SELECT *
FROM  tblForetag
WHERE Gren NOT LIKE 'Underforetag%' 
AND Foretag = 'Foretag3'

Men innehållet i fälten i kolumnen Gren är ju Null? Och tar jag bort Not så returnerar den också ingenting. Typ:

SELECT *
FROM  tblForetag
WHERE Gren LIKE 'Underforetag%' 
AND Foretag = 'Foretag3'

Hur löser jag det då? Jag vill ju fortfarande exkludera alla dom med underföretag?

LarsGMedlem sedan dec. 200012 464 inlägg
#6
 AND (Gren NOT LIKE 'Underforetag%' or Gren is null)
JanspeedMedlem sedan jan. 2001510 inlägg
#7

Jag kan bara tacka och bocka för att du hjälpt mig lösa ett problem som nnästan gjort mig gråhårig. Jag skulle aldrig kunnat lista ut själv att LIKE skulle exkludera alla som var Null.

Tackar återigen.

132 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)