/ 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
Problem med SQL-sætning
Fra : Martin


Dato : 06-10-08 22:32

Hej NG

Jeg har et problem som jeg håber at i kan hjælpe mig med. Jeg har
også postet denne under dk.edb.database, da tråden hører mest
hjemme der, men jeg ved jo at nogle af jer herinde er skarpe til
SQL, så prøver også lige her :)

Jeg har to tabeller i min MSSQL database

Personer som indeholder
ID - int
Henviser - int
Henvist - int
Dato - datetime

Tid som indeholder
ID - int
Nummer - int
Tid - int
Dato - datetime

I tabellen Personer har jeg nogle henvisere, som har henvist
nogle henviste. Nogle af disse henviste, har så henvist nogle nye
henviste, og er dermed også selv blevet henvisere.

Så indholdet af tabellen kunne være
Henviser - Henvist
10000000 - 10000001
10000000 - 10000002
10000000 - 10000003
10000001 - 10000004
10000001 - 10000005
10000002 - 10000006
10000005 - 10000007
10000007 - 10000008
10000008 - 10000009


Tabellen Tid indeholder tid(i hele minutter) som hører til de
numre som er i Personer tabellens Henvist kolonne (så Henvist =
Nummer)

Indholdet af tabellen kunne være
Tid - Nummer
100 - 10000000
150 - 10000001
100 - 10000002
500 - 10000003
200 - 10000004
300 - 10000005
100 - 10000006
200 - 10000007
150 - 10000008
400 - 10000009


Nu kommer så mit problem. Jeg skal have udvalgt summen af den tid
som hver henviser har i 4 leds dybde. Det vil sige at henviser
10000000 skal have summen af tiden for 10000001, 10000002 og
10000003, samt 10000004 og 10000005(som 10000001 har henvist),
10000006(som 10000002 har henvist), 10000007(som 10000005 har
henvist), 10000008(som 10000007 har henvist), MEN IKKE 10000009,
da dette er 5. led i kæden, og heller ikke 10000000(som er
henviseren selv).

Altså skal jeg have udtrukket Henviser 10000000 med tiden 1700.

Jeg skal have udtrukket summen af tiden for alle henvisere, men
det er ikke alle der har 4 led. Eks har 10000008 kun et led
(10000009), og dermed vil udtrækket blive Henviser 10000008 med
tiden 400.

Jeg har efterhånden prøvet en del forskellige ting, men er ikke
rigtigt kommet frem til noget der virker. Med denne sql-sætning
kan jeg få udtrukket første led
SELECT Distinct(Personer.Henviser), SUM(Tid.Tid) AS Tiden,
Personer.Henvist FROM martin.Personer, martin.Tid WHERE
Personer.Henvist = Tid.Nummer GROUP BY Personer.Henviser,
Personer.Henvist ORDER BY Personer.Henviser

Her får jeg dog en lille fejl med, idet den første Henviser får
medregnet sin egen tid (og det skal den jo ikke)

Jeg kan ikke finde ud af hvordan jeg får udvalgt data ned til og
med led 4, og håber på at en af de kloge folk herinde kan 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 (07-10-2008)
Kommentar
Fra : Stig Johansen


Dato : 07-10-08 02:34

"Martin" <har@ingen.dd> wrote in message
news:48ea83d5$0$90275$14726298@news.sunsite.dk...

[snip]

> Jeg kan ikke finde ud af hvordan jeg får udvalgt data ned til og
> med led 4, og håber på at en af de kloge folk herinde kan hjælpe
> mig videre.

Det er lidt giftigt, men jeg har lavet følgende tabeller og data (har kortet
dine numre lidt ned)
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 * FROM Tid
.............
Nummer Tid
----------- -----------
100 150
101 150
102 100
103 500
104 200
105 300
106 100
107 200
108 150
109 400
(10 row(s) affected)
.............

Og så den grimme:
SELECT u.Henviser,SUM(U.Tid) AS Tid 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
..........
Henviser Tid
----------- -----------
100 1750
101 1000
102 100
105 750
107 550
108 400
(6 row(s) affected)
............

--
Med venlig hilsen/Best regards
Stig Johansen




Martin (07-10-2008)
Kommentar
Fra : Martin


Dato : 07-10-08 09:55

Stig Johansen wrote in dk.edb.internet.webdesign.serverside.asp:
> Og så den grimme:
Den er super flot, og virker fantastisk. :)

Jeg har bare lige et andet lille problem nu. Jeg glemte at skrive at den kun
skulle udvælge tid fra denne måned, dette år. Jeg har prøvet at indsætte

AND Month(t1.Dato) = '"&Month(Now)&"' AND Year(t1.Dato) = '"&Year(Now)&"' AND
Month(t2.Dato) = '"&Month(Now)&"' AND Year(t2.Dato) = '"&Year(Now)&"' AND
Month(t3.Dato) = '"&Month(Now)&"' AND Year(t3.Dato) = '"&Year(Now)&"' AND
Month(t4.Dato) = '"&Month(Now)&"' AND Year(t4.Dato) = '"&Year(Now)&"'

lige inden
) AS U GROUP BY u.Henviser ORDER BY u.Henviser")

Det giver det rigtige resultat på det første henviser, men ikke på resten. Jeg
kan ikke lige se hvad jeg gør forkert her. Kan du hjælpe igen?

--
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 (07-10-2008)
Kommentar
Fra : Stig Johansen


Dato : 07-10-08 11:08

Martin wrote:

> Det giver det rigtige resultat på det første henviser, men ikke på resten.
> Jeg kan ikke lige se hvad jeg gør forkert her. Kan du hjælpe igen?

Måske - men du bliver nødt til at uddybe hvad du mener.

Jeg kan godt se du har en 'Dato' i dine tabeller, men du skriver ikke ret
meget om hvad betydningen er.

Giv gerne nogle eksempler (på datoer og deres betydning).

--
Med venlig hilsen
Stig Johansen

Martin (07-10-2008)
Kommentar
Fra : Martin


Dato : 07-10-08 11:45

Stig Johansen wrote in dk.edb.internet.webdesign.serverside.asp:
> Måske - men du bliver nødt til at uddybe hvad du mener.
>
> Jeg kan godt se du har en 'Dato' i dine tabeller, men du skriver ikke ret
> meget om hvad betydningen er.
>
> Giv gerne nogle eksempler (på datoer og deres betydning).


Hvis vi kigger på de tabeller du selv brugte, og udbygger indholdet af Tid
tabellen. En gang hver måned uploader jeg data til Tid tabellen(Nummer og Tid),
og indsætter dags dato i Dato feltet. Så hvis jeg i måned 9 og 10 har uploadet
data, kan det se sådan ud.:

Henviser Henvist
----------- -----------
100 101
100 102
100 103
101 104
101 105
102 106
105 107
107 108
108 109

Nummer Tid Dato
----------- -----------
100 150 01-09-2008
101 150 01-09-2008
102 100 01-09-2008
103 500 01-09-2008
104 200 01-09-2008
105 300 01-09-2008
106 100 01-09-2008
107 200 01-09-2008
108 150 01-09-2008
109 400 01-09-2008
100 150 01-10-2008
101 150 01-10-2008
102 100 01-10-2008
103 500 01-10-2008
104 200 01-10-2008
105 300 01-10-2008
106 100 01-10-2008
107 200 01-10-2008
108 150 01-10-2008
109 400 01-10-2008

Så vil det med nuværende kode blive det dobbelte af hvad du kom frem til. Jeg
vil godt have så jeg kan udtrække enten for måned 9 eller for måned 10 i år.
(hvis jeg bruger Now nu, vil det jo blive måned 10 :)

Håber at du forstår mig nu, ellers skal jeg nok prøve igen.

--
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 (07-10-2008)
Kommentar
Fra : Stig Johansen


Dato : 07-10-08 12:03

"Martin" <har@ingen.kk> wrote in message
news:48eb3dc0$0$90263$14726298@news.sunsite.dk...
> Så vil det med nuværende kode blive det dobbelte af hvad du kom frem til.
Jeg
> vil godt have så jeg kan udtrække enten for måned 9 eller for måned 10 i
år.
> (hvis jeg bruger Now nu, vil det jo blive måned 10 :)
>
> Håber at du forstår mig nu, ellers skal jeg nok prøve igen.

Måske, måske ikke.

Der er mulighed for at lave ekstra 'klausuler' for udvælgelse, her er
eksempelvis en udvidelse jfr. tidligere eksempel:
SELECT u.Henviser,SUM(U.Tid) AS Tid 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 AND t2.Tid > 100
..... osv...
Bemærk her:
INNER JOIN Tid t2 ON t2.Nummer = p2.henvist AND t2.Tid > 100
især "AND t2.Tid > 100"

Det burde kunne bruges på samme måde med udvælgelse af et givet dato
interval.

--
Med venlig hilsen/Best regards
Stig Johansen




Martin (07-10-2008)
Kommentar
Fra : Martin


Dato : 07-10-08 14:11

Stig Johansen wrote in dk.edb.internet.webdesign.serverside.asp:
> Det burde kunne bruges på samme måde med udvælgelse af et givet dato
> interval.

Jeg har nu indsat tidsudvælgelsen sådan her:
SELECT u.Henviser,SUM(U.Tid) AS Tid FROM (SELECT '1' AS
State,p.henviser,t1.tid AS Tid FROM personer p INNER JOIN Tid t1 ON t1.nummer
= p.henvist AND Month(t1.Dato) = '"&Month(Now)&"' AND Year(t1.Dato) =
'"&Year(Now)&"' 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 AND
Month(t2.Dato) = '"&Month(Now)&"' AND Year(t2.Dato) = '"&Year(Now)&"' UNION
ALL
...
Og det kører uden probler nu (ikke 100% gennemtestet) Jeg var ellers ret
sikker på at jeg havde prøvet den løsning også, men det må jeg jo ikke have
gjort.

Rigtigt mange gange tak for hjælpen. Nu er jeg også ved at kunne forstå lidt
af hvad der sker deri :)


--
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

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

Månedens bedste
Årets bedste
Sidste års bedste