/ Forside / Teknologi / Udvikling / ASP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
ASP
#NavnPoint
smorch 9259
Harlekin 1866
molokyle 1040
Steffanst.. 758
gandalf 657
smilly 564
gibson 560
cumano 530
MouseKeep.. 480
10  Random 410
SQL Count flere gange i samme tabel
Fra : Martin


Dato : 27-10-08 22:41

Hej NG (specielt Stig Johansen :) )

Den 6/10 oprettede jeg et spørgsmål angående en sql streng. Jeg
troede egentligt at jeg havde fået styr på alle de her inner
join's osv. Men nu hvor jeg skal lave noget lignende, kan jeg
ikke få det til at virke. Jeg har tænkt, tegnet, prøvet osv hele
dagen, men kan bare ikke komme frem til noget der ligner en
løsning.

I min MSSQL Database har jeg tabellen Personer som indeholder
Henviser og Henvist
Indholdet af denne tabel kunne se sådan ud
Henviser Henvist
100 101
100 102
100 103
101 104
101 105
102 106
103 107
106 108
108 109
109 110

Jeg vil nu gerne have summen af hvor mange poster der er hvor
Henviser = xxx(eks 100), sammenlagt med summen af antallet af
poster hvor Henviser er dem som Henviser har henvist osv i 4
niveauer.
så hvis xxx = 100 ville det først niveau blive 3 (101,102,103),
niveau 2 vil blive 4 (104,105,106,107), niveau 3 vil blive 1(108)
og niveau 4 vil blive 1 (109), så det samlede tal som jeg er
interesseret er 3+4+1+1 = 9
Det er ikke sikkert at der er 4 niveauer(hvis xxx=109 er der jo
kun 1 niveau). Der kan sagtens være mere end 4 niveaur, men der
skal max tælles for 4 niveauer.

Er der nogen af jer der kan forklare mig hvordan jeg skal
sammenstrikke en SQL der kan tælle dette for mig?

--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

 
 
Stig Johansen (28-10-2008)
Kommentar
Fra : Stig Johansen


Dato : 28-10-08 00:27

"Martin" <har@ingen.dd> wrote in message
news:4906355f$0$90264$14726298@news.sunsite.dk...
> Hej NG (specielt Stig Johansen :) )
>
> Den 6/10 oprettede jeg et spørgsmål angående en sql streng. Jeg
> troede egentligt at jeg havde fået styr på alle de her inner
> join's osv. Men nu hvor jeg skal lave noget lignende, kan jeg
> ikke få det til at virke. Jeg har tænkt, tegnet, prøvet osv hele
> dagen, men kan bare ikke komme frem til noget der ligner en
> løsning.
>
> I min MSSQL Database har jeg tabellen Personer som indeholder
> Henviser og Henvist
> Indholdet af denne tabel kunne se sådan ud
> Henviser Henvist
> 100 101
> 100 102
> 100 103
> 101 104
> 101 105
> 102 106
> 103 107
> 106 108
> 108 109
> 109 110
>
> Jeg vil nu gerne have summen af hvor mange poster der er hvor
> Henviser = xxx(eks 100), sammenlagt med summen af antallet af
> poster hvor Henviser er dem som Henviser har henvist osv i 4
> niveauer.
> så hvis xxx = 100 ville det først niveau blive 3 (101,102,103),
> niveau 2 vil blive 4 (104,105,106,107), niveau 3 vil blive 1(108)
> og niveau 4 vil blive 1 (109), så det samlede tal som jeg er
> interesseret er 3+4+1+1 = 9
> Det er ikke sikkert at der er 4 niveauer(hvis xxx=109 er der jo
> kun 1 niveau). Der kan sagtens være mere end 4 niveaur, men der
> skal max tælles for 4 niveauer.
>
> Er der nogen af jer der kan forklare mig hvordan jeg skal
> sammenstrikke en SQL der kan tælle dette for mig?

Jeg har citeret det hele, for jeg synes ikke rigtig jeg kunne finde passende
klip.
Nu bruger du nogle andre data end sidst, så jeg er ikke 100% sikker på om
jeg forstår dig ret.
Eller rettere, jeg får et andet resultat.
Men med disse data:
select * from personer
Henviser Henvist
----------- -----------
100 101
100 102
100 103
101 104
101 105
102 106
105 107
107 108
108 109
(9 row(s) affected)
Og så ved at rette SUM til COUNT i første linie i det samme SQL 'som sidst'
SELECT u.Henviser,COUNT(U.Tid) AS Antal FROM (
SELECT '1' AS State,p.henviser,t1.tid AS Tid
FROM personer p
INNER JOIN Tid t1 ON t1.nummer = p.henvist
UNION ALL
SELECT '2' AS State,p.henviser,t2.tid AS Tid
FROM personer p
INNER JOIN Tid t1 ON t1.nummer = p.henvist
INNER JOIN Personer p2 ON p2.henviser = p.henvist
INNER JOIN Tid t2 ON t2.Nummer = p2.henvist
UNION ALL
SELECT '3' AS State,p.henviser,t3.tid AS Tid
FROM personer p
INNER JOIN Tid t1 ON t1.nummer = p.henvist
INNER JOIN Personer p2 ON p2.henviser = p.henvist
INNER JOIN Tid t2 ON t2.Nummer = p2.henvist
INNER JOIN Personer p3 ON p3.henviser = p2.henvist
INNER JOIN Tid t3 ON t3.Nummer = p3.henvist
UNION ALL
SELECT '4' AS State,p.henviser,t3.tid AS Tid
FROM personer p
INNER JOIN Tid t1 ON t1.nummer = p.henvist
INNER JOIN Personer p2 ON p2.henviser = p.henvist
INNER JOIN Tid t2 ON t2.Nummer = p2.henvist
INNER JOIN Personer p3 ON p3.henviser = p2.henvist
INNER JOIN Tid t3 ON t3.Nummer = p3.henvist
INNER JOIN Personer p4 ON p4.henviser = p3.henvist
INNER JOIN Tid t4 ON t4.Nummer = p4.henvist
) AS U
GROUP BY u.Henviser
ORDER BY u.Henviser

så giver den:
Henviser Antal
----------- -----------
100 8
101 5
102 1
105 3
107 2
108 1
(6 row(s) affected)

Og så en ting jeg glemte sidst:
De der '1'..'4' AS state lavede jeg egentlig for at du kan 'debugge' eller
se hvad der foregår.
Det er ikke nødvendigt i det færdige SQL.

Hvis du klipper det ud, der er 'inderst' i SQL'et, dvs. i det her tilfælde:
SELECT '1' AS State,p.henviser,t1.tid AS Tid
FROM personer p
INNER JOIN Tid t1 ON t1.nummer = p.henvist
UNION ALL
SELECT '2' AS State,p.henviser,t2.tid AS Tid
FROM personer p
INNER JOIN Tid t1 ON t1.nummer = p.henvist
INNER JOIN Personer p2 ON p2.henviser = p.henvist
INNER JOIN Tid t2 ON t2.Nummer = p2.henvist
UNION ALL
SELECT '3' AS State,p.henviser,t3.tid AS Tid
FROM personer p
INNER JOIN Tid t1 ON t1.nummer = p.henvist
INNER JOIN Personer p2 ON p2.henviser = p.henvist
INNER JOIN Tid t2 ON t2.Nummer = p2.henvist
INNER JOIN Personer p3 ON p3.henviser = p2.henvist
INNER JOIN Tid t3 ON t3.Nummer = p3.henvist
UNION ALL
SELECT '4' AS State,p.henviser,t3.tid AS Tid
FROM personer p
INNER JOIN Tid t1 ON t1.nummer = p.henvist
INNER JOIN Personer p2 ON p2.henviser = p.henvist
INNER JOIN Tid t2 ON t2.Nummer = p2.henvist
INNER JOIN Personer p3 ON p3.henviser = p2.henvist
INNER JOIN Tid t3 ON t3.Nummer = p3.henvist
INNER JOIN Personer p4 ON p4.henviser = p3.henvist
INNER JOIN Tid t4 ON t4.Nummer = p4.henvist
ORDER BY Henviser

Så bliver resultatet:
State henviser Tid
----- ----------- -----------
1 100 150
1 100 100
1 100 500
2 100 100
2 100 200
2 100 300
3 100 200
4 100 200
4 101 150
3 101 150
2 101 200
1 101 200
1 101 300
1 102 100
1 105 200
2 105 150
3 105 400
2 107 400
1 107 150
1 108 400
(20 row(s) affected)

State er i virkeligheden niveau (hmm - hvorfor kaldte jeg det state?)
Men her er der, ud fra de 'mine' data, kun 3 på niveau 2, for xxx=100, så
antallet er 8, og ikke som dine 9.

Måske en længere smøre, men det burde være nok bare at rette SUM til COUNT i
første linie.

--
Med venlig hilsen/Best regards
Stig Johansen




Martin Jensen (28-10-2008)
Kommentar
Fra : Martin Jensen


Dato : 28-10-08 09:36

Stig Johansen wrote in dk.edb.internet.webdesign.serverside.asp:

> Nu bruger du nogle andre data end sidst, så jeg er ikke 100% sikker på om
> jeg forstår dig ret.

Det er bare helt tilfældigt det jeg har skrevet lige nu, så det skal nok passe
at det ikke er de samme som sidst

> Og så ved at rette SUM til COUNT i første linie i det samme SQL 'som sidst'
> SELECT u.Henviser,COUNT(U.Tid) AS Antal FROM (

Nu bliver tabellen Tid blandet ind, og det er ikke meningen. Jeg er kun
interesseret i de data der er i tabellen personer. Jeg har prøvet at rette i
din kode, og har fået den til at tælle et eller andet, men i hvert fald ikke
det rigtige.
Nu skal jeg nok bruge det samme data som dig
select * from personer
Henviser Henvist
----------- -----------
100 101
100 102
100 103
101 104
101 105
102 106
105 107
107 108
108 109
(9 row(s) affected)



SELECT Henviser, COUNT(Henvist) AS Antal
FROM (SELECT '1' AS State, p.Henviser, p1.Henvist
FROM Personer AS p INNER JOIN
Personer AS p1 ON p1.Henviser = p.Henvist
UNION ALL
SELECT '2' AS State, p.Henviser, p2.Henvist
FROM Personer AS p INNER JOIN
Personer AS p1 ON p1.Henviser = p.Henvist INNER JOIN
Personer AS p2 ON p2.Henviser = p1.Henvist
UNION ALL
SELECT '3' AS State, p.Henviser, p3.Henvist
FROM Personer AS p INNER JOIN
Personer AS p1 ON p1.Henviser = p.Henvist INNER JOIN
Personer AS p2 ON p2.Henviser = p1.Henvist INNER JOIN
Personer AS p3 ON p3.Henviser = p2.Henvist
UNION ALL
SELECT '4' AS State, p.Henviser, p4.Henvist
FROM Personer AS p INNER JOIN
Personer AS p1 ON p1.Henviser = p.Henvist INNER JOIN
Personer AS p2 ON p2.Henviser = p1.Henvist INNER JOIN
Personer AS p3 ON p3.Henviser = p2.Henvist INNER JOIN
Personer AS p4 ON p4.Henviser = p3.Henvist) AS U
GROUP BY Henviser
ORDER BY Henviser

Hvilket giver
Henviser Antal
100 6
101 3
105 2
107 1

Nu kan jeg jo se at der er noget galt med min kode, da det burde have givet
Henviser Antal
100 8
101 5
102 1
105 3
107 2
108 1
som du også skriver at du kan få det til. (jeg vil dog gætte på at det er fordi
der kun ligger data fra en periode i din Tid tabel.)

Kan du se hvad jeg gør forkert og hjælpe mig videre?

--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Stig Johansen (28-10-2008)
Kommentar
Fra : Stig Johansen


Dato : 28-10-08 10:50

"Martin Jensen" <har@ingen.kk> wrote in message
news:4906cedd$0$90273$14726298@news.sunsite.dk...
> Stig Johansen wrote in dk.edb.internet.webdesign.serverside.asp:
> > Og så ved at rette SUM til COUNT i første linie i det samme SQL 'som
sidst'
> > SELECT u.Henviser,COUNT(U.Tid) AS Antal FROM (
>
> Nu bliver tabellen Tid blandet ind, og det er ikke meningen.

Dovenskab - my friend - dovenskab (=copy/paste)

Denne her:
SELECT u.Henviser,COUNT(*) AS Antal FROM (
SELECT '1' AS State,p.henviser
FROM personer p
UNION ALL
SELECT '2' AS State,p.henviser
FROM personer p
INNER JOIN Personer p2 ON p2.henviser = p.henvist
UNION ALL
SELECT '3' AS State,p.henviser
FROM personer p
INNER JOIN Personer p2 ON p2.henviser = p.henvist
INNER JOIN Personer p3 ON p3.henviser = p2.henvist
UNION ALL
SELECT '4' AS State,p.henviser
FROM personer p
INNER JOIN Personer p2 ON p2.henviser = p.henvist
INNER JOIN Personer p3 ON p3.henviser = p2.henvist
INNER JOIN Personer p4 ON p4.henviser = p3.henvist
) AS U
GROUP BY u.Henviser
ORDER BY u.Henviser
giver:
Henviser Antal
----------- -----------
100 8
101 5
102 1
105 3
107 2
108 1
(6 row(s) affected)

ud fra datasættet:
select * from personer
.....
Henviser Henvist
----------- -----------
100 101
100 102
100 103
101 104
101 105
102 106
105 107
107 108
108 109
(9 row(s) affected)


--
Med venlig hilsen/Best regards
Stig Johansen




Martin Jensen (28-10-2008)
Kommentar
Fra : Martin Jensen


Dato : 28-10-08 11:44

Stig Johansen wrote in dk.edb.internet.webdesign.serverside.asp:

> Dovenskab - my friend - dovenskab (=copy/paste)

Det skal der så absolut også være plads til :)


> Denne her:
> SELECT u.Henviser,COUNT(*) AS Antal FROM (
> SELECT '1' AS State,p.henviser
> FROM personer p
> UNION ALL
> SELECT '2' AS State,p.henviser
> FROM personer p
> INNER JOIN Personer p2 ON p2.henviser = p.henvist
> UNION ALL
> SELECT '3' AS State,p.henviser
> FROM personer p
> INNER JOIN Personer p2 ON p2.henviser = p.henvist
> INNER JOIN Personer p3 ON p3.henviser = p2.henvist
> UNION ALL
> SELECT '4' AS State,p.henviser
> FROM personer p
> INNER JOIN Personer p2 ON p2.henviser = p.henvist
> INNER JOIN Personer p3 ON p3.henviser = p2.henvist
> INNER JOIN Personer p4 ON p4.henviser = p3.henvist
> ) AS U
> GROUP BY u.Henviser
> ORDER BY u.Henviser
> giver:
> Henviser Antal
> ----------- -----------
> 100 8
> 101 5
> 102 1
> 105 3
> 107 2
> 108 1
> (6 row(s) affected)

Jamen det gør jo som det skal. Mange tak.

Jeg kan se at jeg var tæt på. I forhold til min SQL, har du (så vidt jeg
kan se) fjernet alt der har med p1 at gøre. Jo mere jeg kigger sætningen
igennem, jo mere mening giver det. Håber at jeg har styr på det, så jeg
selv kan klare det næste gang :)

--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Stig Johansen (29-10-2008)
Kommentar
Fra : Stig Johansen


Dato : 29-10-08 07:22

Martin Jensen wrote:

> Jeg kan se at jeg var tæt på. I forhold til min SQL, har du (så vidt jeg
> kan se) fjernet alt der har med p1 at gøre.

Nu går det op for mig hvad du mener (med p1).
Nej - jeg tog udgangspunkt i 'min' sql og fjernede referencerne til tid.
Det er muligvis lidt uhøfligt, men jeg havde slet ikke kigget på din SQL.

--
Med venlig hilsen
Stig Johansen

Søg
Reklame
Statistik
Spørgsmål : 177579
Tips : 31968
Nyheder : 719565
Indlæg : 6409074
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste