Just nu i M3-nätverket
Gå till innehåll

Lite besvärlig sql-sats.


mindsleep

Rekommendera Poster

Har ett lite besvärligt problem som jag behöver hjälp med.

 

Har 3 tabeller som ser ut ungefär så här (förenklat):

[projekt]

pid,pnamn

 

[projektposter]

ppid,antaltimmar,projektId

 

[kostnader]

kid,prispertimme

 

Logiken är att ett projekt kan innehålla flera projektposter.

 

Vad jag vill ha ut nu är ENDAST projekten...det vill säga:

SELECT * from projekt hade kunnat fungera om det inte behövdes göra ett par uträkningar.

 

Så här vill jag det ska fungera:

1. Hämta ut post 1 i projekt.

2. Slå ihop alla projektposter.antaltimmar för alla poster som tillhör projektet (porjektId)

3. Det totala värdet av projektposter.antaltimmar ska nu gångras med kostnader.prispertimme.

4. Presentera post 1 i projekt med det uträknade värdet som "Tot. kostnad".

 

Och så körs det igen...hämtar ut post 2 i projekt tabellen...osv.

 

Jag har testat x antal Inner Joins och outer Joins men jag får det helt enkelt inte att fungera som jag vill.

 

Hur löser jag detta?

 

//MVH Mindsleep

 

I am who i am, you are who you are, i respect that

 

Länk till kommentar
Dela på andra webbplatser

select pid,pnamn,sum(antaltimmar)*450 from projekt join projektposter on pid = projektid group by pid,pnamn

 

Där 450 är timpriset eftersom jag inte kunde se någon relation till tabellen kostnader från tabellen projekt.

 

 

 

[inlägget ändrat 2007-08-20 13:30:39 av Mr Andersson]

Länk till kommentar
Dela på andra webbplatser

Ser bra ut. MEN...litet problem. Den hämtar ut endast projekt som har poster i "projektposter". Alla projekt måste hämtas ut. Även om de inte har poster i projektposter.

 

//MVH Mindsleep

 

I am who i am, you are who you are, i respect that

 

Länk till kommentar
Dela på andra webbplatser

select pid,pnamn,sum(antaltimmar)*450 from projekt left join projektposter on pid = projektid group by pid,pnamn

 

 

 

Länk till kommentar
Dela på andra webbplatser

Start tack. Nu ska jag konvertera din hjälp till min SQL sats som är lite längre och besvärligare. Men hade problem med just det här och nu ska det gå fin fint.

 

Tack tack.

 

//MVH Mindsleep

 

I am who i am, you are who you are, i respect that

 

Länk till kommentar
Dela på andra webbplatser

Vid närmare granskning upptäcker jag att det inte fungerar. Alla projekt hämtas ut. Men de tillhörande projektposterna adderas inte till varandra. Det verkar som endast den första projektposten adderas. De resternade adderas inte.

 

Med andra ord så är det steg 2 som misslyckas ur mitt ursprungsinlägg.

 

Hjälp.

 

//MVH Mindsleep

 

I am who i am, you are who you are, i respect that

 

[inlägget ändrat 2007-08-20 22:45:53 av mindsleep]

Länk till kommentar
Dela på andra webbplatser

Vid närmare granskning upptäcker jag att det inte fungerar. Alla projekt hämtas ut. Men de tillhörande projektposterna adderas inte till varandra

 

Jo, det fungerar. Kan hända att du hittat på nåt mera i frågan som får den att göra fel, men den biten som jag hjälpte dig med, fungerar. Jag har verifierat det genom att göra en databas på det sätt som du beskrivit och testkört frågan.

 

 

 

 

Länk till kommentar
Dela på andra webbplatser

Jo, jag har byggt på den med andra beräkningar.

 

Ska felchecka igen. Återkommer.

 

//MVH Mindsleep

 

I am who i am, you are who you are, i respect that

 

Länk till kommentar
Dela på andra webbplatser

Mitt fel...hade slarvat bort sum() och bara istället använt () av någon underlig anledning.

 

Ett problem till:

 

Har gjort typ så här:

select pid,pnamn,sum(antaltimmar)*450 AS 'summaVar' from projekt left join projektposter on pid = projektid group by pid,pnamn

 

Nu skulle jag vilja ha "summaVar" - projekt.cost AS 'resultatVar'

 

Båda siffrorna ska presenteras....summaVar och resultatVar

 

Har försökt med:

sum(antaltimmar)*450 AS 'summaVar', sum('summaVar'-projekt.cost) AS 'resultatVar'.

 

Men får bara roliga svar tillbaka (felaktiga beräkningar). Det fungerar säkert att göra alla beräkningar en gång till. Men det kanske finns en bättre metod än att slö ned databasen med ytterligare beräkningar?

 

//MVH Mindsleep

 

I am who i am, you are who you are, i respect that

 

[inlägget ändrat 2007-08-21 16:43:06 av mindsleep]

Länk till kommentar
Dela på andra webbplatser

Båda siffrorna ska presenteras....summaVar och resultatVar

 

Jag vet inget annat än att använda samma beräkning två gånger, även om det låter idiotiskt (men jag kan ha fel).

 

Men det kanske finns en bättre metod än att slö ned databasen med ytterligare beräkningar?

 

Beräkningar som är så enkla tar inte mycket kraft. Eftersom det är samma beräkning som görs två gånger, ser SQL-servern det och gör bara en beräkning, men använder svaret två gånger.

 

 

 

Länk till kommentar
Dela på andra webbplatser

Beräkningar som är så enkla tar inte mycket kraft. Eftersom det är samma beräkning som görs två gånger, ser SQL-servern det och gör bara en beräkning, men använder svaret två gånger.

 

Min SQL sats innehåller en hel del andra beräkningar och dyl (typ 10 sum) och en hel del kopplande med andra tabeller så jag tror säkert att det är lite tungt.

 

Det roliga är att jag inte fick fel på:

'antalsumma'-projekt.cost

 

Inga felmeddelande eller något. Men fel värde fick jag i alla fall.

 

//MVH Mindsleep

 

I am who i am, you are who you are, i respect that

 

Länk till kommentar
Dela på andra webbplatser

en hel del andra beräkningar och dyl (typ 10 sum) och en hel del kopplande med andra tabeller

Läge att använda SP:s istället tycker jag.

Förutom det givna, att SP:s är effektivare än komplexa frågor så har du också den otroligt viktiga fördelen av mycket läsbarare kod som därmed är simplare att debugga.

 

Länk till kommentar
Dela på andra webbplatser

SP=Stored procedures

 

Jaja...fattar. Ska se vad jag hittar på.

 

(PS. Du har väl inte glömt Nasa, en kvart kvar)

 

Absolut inte...ses i tick tack tråden du skapade :)

 

//MVH Mindsleep

 

I am who i am, you are who you are, i respect that

 

Länk till kommentar
Dela på andra webbplatser

Nej, det gick inte. Jag gjorde beräkningen:

 

'antalsumma'-projekt.cost direkt i PHP. Det gick fint innan jag inser att jag måste kunna sortera efter resultatet och måste därför göra beräkningen i SQL eftersom det är där sorteringen görs.

 

Så först har jag en lång beräkning som ger korrekt resultat som ser ut ungefär så här:

sum(en massa beräkningar som blir korrekta) AS 'summaVar'

 

Sedan måste jag dra ifrån resultatet i 'summaVar' med projekt.cost och då har jag:

sum(en massa beräkningar som blir korrekta) AS 'summaVar', sum(projekt.cost-(samma uträkning som gjorde för 'summaVar')) AS results

 

Inga felmeddelande eller något. Men results blir fel värde...varför?

 

//MVH Mindsleep

 

I am who i am, you are who you are, i respect that

 

Länk till kommentar
Dela på andra webbplatser

sum(en massa beräkningar som blir korrekta) AS 'summaVar', sum(projekt.cost-(samma uträkning som gjorde för 'summaVar')) AS results

 

Du menar

 

sum(en massa beräkningar som blir korrekta) AS 'summaVar', sum(projekt.cost-sum(samma uträkning som gjorde för 'summaVar')) AS results

 

?

 

Det du har gjort ska fungera. Du kan gå en omväg genom att skapa en temporär tabell och skyffla in resultaten där efterhand som du räknar fram dem, och sen göra slutliga beräkningar och sorteringar i den temporära tabellen. Lite krångligare, lite segare...

 

 

 

 

[inlägget ändrat 2007-08-22 13:59:31 av Mr Andersson]

Länk till kommentar
Dela på andra webbplatser

När jag använder sum() i sista beräkningen...får jag fel:

 

Invalid use of group function

 

Ser ut så här i sqlsatsen:

GROUP BY projekt.pid

 

//MVH Mindsleep

 

I am who i am, you are who you are, i respect that

 

[inlägget ändrat 2007-08-22 14:21:52 av mindsleep]

[inlägget ändrat 2007-08-22 14:24:58 av mindsleep]

[inlägget ändrat 2007-08-22 14:26:08 av mindsleep]

[inlägget ändrat 2007-08-22 14:26:26 av mindsleep]

Länk till kommentar
Dela på andra webbplatser

Ballanserar paranteserna?

Ja.

 

ser ut så här:

sum(projekt.cost-sum(alla beräkningar som gjordes tidigare)) AS resultat,..

 

//MVH Mindsleep

 

I am who i am, you are who you are, i respect that

 

Länk till kommentar
Dela på andra webbplatser

Det blir tokigt. Sum(projekt.cost....) kommer att addera alla projekt.cost, alltså, om du har 3 st projektposter för ett projekt kommer du att få (ex) 3 * 450.

 

 

Testa att lägga till projekt.cost i group by och ta bort sum runt projekt.cost.

 

 

 

 

Länk till kommentar
Dela på andra webbplatser

Testa att lägga till projekt.cost i group by och ta bort sum runt projekt.cost

 

Underbart...nu är vi nära.

 

Det räckte med att slita bort den tokiga sum()!

 

Alla siffror blir korrekta förutom då projekt kostnaden är ex. 1000 och den uträknade summan blir 0...då borde det ju bli 1000 (1000-0=1000) men det blir 0 av någon konstig anledning. Alla andra siffror stämmer. Vet du vad detta beror på?

 

Vet du också hur stora beräkningar som kan göras i en SQL sats (MySQL)?

 

//MVH Mindsleep

 

I am who i am, you are who you are, i respect that

 

[inlägget ändrat 2007-08-22 15:14:27 av mindsleep]

Länk till kommentar
Dela på andra webbplatser

Alla siffror blir korrekta förutom då projekt kostnaden är ex. 1000 och den uträknade summan blir 0...då borde det ju bli 1000 (1000-0=1000) men det blir 0 av någon konstig anledning. Alla andra siffror stämmer. Vet du vad detta beror på?

 

Om du menar för projekt som saknar projektposter, så är antaltimmar null (inte 0) och alla beräkningar kommer då att bli helt fel.

 

Hur du löser det i MySQL vet jag inte, men i MS-SQL blir det:

 

select pid,pnamn,isnull(sum(antaltimmar),0)*450 from projekt

 

Det finns säkert nån liknande funktion i MySQL.

 

Vet du också hur stora beräkningar som kan göras i en SQL sats (MySQL)?

 

Det klarar större än vad man har nytta av... men jag tror gränsen är 64-bitarstal, men är inte alls säker.

 

 

 

Länk till kommentar
Dela på andra webbplatser

Tack för all hjälp och ditt tålamod Mr Andersson!

 

Poäng igen!

 

Sista problemet var ju att sorteringen blir fel om sista beräkningen inte hittar några projektposter och returnerar NULL. Så om den gör det så ska ett annat värde från projekt presenteras (finns inte med i mitt exempel)....tack vare din ledtråd sprang jag igen på MySQL och hittade en lösning som fungerar utmärkt. Ser ut så här

 

IFNULL(ettvärde-sum(en massa uträkningar),projekt.budget) AS 'resultat'

 

Tack var det blir sedan sorteringen korrekt:

ORDER BY 'resultat' DESC

 

Perfekt!

 

Som sagt. Tack för all hjälp!

 

//MVH Mindsleep

 

I am who i am, you are who you are, i respect that

 

Länk till kommentar
Dela på andra webbplatser

Tack för all hjälp och ditt tålamod Mr Andersson!

 

Tack, jag tycker bara det är kul!

 

Perfekt!

 

Som sagt. Tack för all hjälp!

 

Kul att du fick det att fungera som du vill!

 

 

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...