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

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
MySQL: Fejl i SUM-sammenligning
Fra : Kasper Johansen


Dato : 09-06-05 16:31

Hej gruppe.

Jeg summere her to tabeller, for til sidst at vælge dem hvor summen ikke er
den samme.

Jeg får dog fejlen "Unknown column 'navibeloeb' in 'where clause'", som jeg
slet ikke kan forstå, da jeg har defineret denne i min "SELECT". Hvis jeg
bruger funktionerne SUM(), som de står i SELECT'en, fejler den også, og
påstår at min "GROUP BY" er ugyldig.

Jeg bruger MySQL 4,1.


Her er min query:

<MySQL>

SELECT
rs_afstemte.nr,
SUM(rs_navi.beloeb) AS navibeloeb,
SUM(rs_unitel.beloeb) AS unitelbeloeb

FROM
rs_navi,
rs_unitel,
rs_afstemte

WHERE
rs_afstemte.regnskabid = '$rid' &&
rs_navi.regnskabid = '$rid' &&
rs_unitel.regnskabid = '$rid' &&

rs_navi.afstemtid = rs_afstemte.nr &&
rs_unitel.afstemtid = rs_afstemte.nr &&

navibeloeb != unitelbeloeb

GROUP BY
rs_afstemte.nr

ORDER BY
rs_afstemte.nr

</MySQL>


Jeg håber der er nogle der kan bringe mig på rette spor :'(

--
Mvh Kasper Johansen



 
 
Peter Brodersen (09-06-2005)
Kommentar
Fra : Peter Brodersen


Dato : 09-06-05 19:30

On Thu, 9 Jun 2005 17:30:30 +0200, "Kasper Johansen"
<kasper@johansen.tdcadsl.dk> wrote:

>Jeg får dog fejlen "Unknown column 'navibeloeb' in 'where clause'", som jeg
>slet ikke kan forstå, da jeg har defineret denne i min "SELECT". Hvis jeg
>bruger funktionerne SUM(), som de står i SELECT'en, fejler den også, og
>påstår at min "GROUP BY" er ugyldig.

Du kan ikke bruge aliaser i din where.

Hvis det handler om at du vil lave en udvælging af rækker *efter*
aggregeringen (WHERE bliver foretaget før GROUP BY), så skal du bruge
HAVING i stedet for.

Fx:

WHERE
....
GROUP BY
rs_afstemte.nr
HAVING
navibeloeb != unitelbeloeb

--
- Peter Brodersen

Kasper Johansen (10-06-2005)
Kommentar
Fra : Kasper Johansen


Dato : 10-06-05 09:01

"Peter Brodersen" <usenet2005@ter.dk> skrev i en meddelelse
news:d8a1t2$qda$1@news.klen.dk...
> Du kan ikke bruge aliaser i din where.
>
> Hvis det handler om at du vil lave en udvælging af rækker *efter*
> aggregeringen (WHERE bliver foretaget før GROUP BY), så skal du bruge
> HAVING i stedet for.
>
> Fx:
>
> WHERE
> ...
> GROUP BY
> rs_afstemte.nr
> HAVING
> navibeloeb != unitelbeloeb

Det virkede som det skulle, jeg takker ydmygt.


--
Mvh Kasper Johansen



Kasper Johansen (10-06-2005)
Kommentar
Fra : Kasper Johansen


Dato : 10-06-05 12:21

"Peter Brodersen" <usenet2005@ter.dk> skrev i en meddelelse
news:d8a1t2$qda$1@news.klen.dk...
> GROUP BY
> rs_afstemte.nr
> HAVING
> navibeloeb != unitelbeloeb

Når jeg prøver det får jeg en fejl i summeringen af "unitels".

Se evt. følgende link (det kan tage op til 20 sek for databasen, at gå al
dataen igennem):

http://kasperj.lir.dk/regnskab/?show=hmm


Det første røde felt, er der hvor jeg har talt alle sammen.
Det næste røde felt, er den SUM() som databasen returnere.

De to summer burde jo meget gerne være det samme, men er det åbenbart ikke?


--
Mvh Kasper Johansen



Kasper Johansen (10-06-2005)
Kommentar
Fra : Kasper Johansen


Dato : 10-06-05 12:29

"Kasper Johansen" <kasper@johansen.tdcadsl.dk> skrev i en meddelelse
news:42a9778f$0$18649$14726298@news.sunsite.dk...
> Se evt. følgende link (det kan tage op til 20 sek for databasen, at gå al
> dataen igennem):
>
> http://kasperj.lir.dk/regnskab/?show=hmm

Anyways, så ser koden til nævnte side således ud:


<table class="rs_status_table" border="0" width="100%" cellspacing="0"
cellpadding="2">
<?
$rid = "12";

$count = 0;

$f_gf = mysql_query("
SELECT
rs_afstemte.nr,
SUM(rs_navi.beloeb) AS navi_beloeb,
SUM(rs_unitel.beloeb) AS unitel_beloeb

FROM
rs_navi,
rs_unitel,
rs_afstemte

WHERE
rs_afstemte.regnskabid = '$rid' &&
rs_navi.regnskabid = '$rid' &&
rs_unitel.regnskabid = '$rid' &&

rs_navi.afstemtid = rs_afstemte.nr &&
rs_unitel.afstemtid = rs_afstemte.nr

GROUP BY
rs_afstemte.nr,
rs_unitel.afstemtid,
rs_navi.afstemtid

HAVING
navi_beloeb != unitel_beloeb

ORDER BY
rs_afstemte.nr
") or die(mysql_error());

while($d_gf = mysql_fetch_array($f_gf)){
$count++;

$navis = "";
$unitels = "";

$f_gn = mysql_query("SELECT * FROM rs_navi WHERE afstemtid = '$d_gf[nr]'")
or die(mysql_error());
while($d_gn = mysql_fetch_array($f_gn)){
$navis[] = $d_gn;
}

$f_gu = mysql_query("SELECT * FROM rs_unitel WHERE afstemtid =
'$d_gf[nr]'") or die(mysql_error());
while($d_gu = mysql_fetch_array($f_gu)){
$unitels[] = $d_gu;
}

$countf = 0;

if (count($navis) > count($unitels)){
$countt = count($navis);
}else{
$countt = count($unitels);
}

$navi_fullbeloeb = 0;
$unitel_fullbeloeb = 0;

while($countf < $countt){
$navid = $navis[$countf];
$uniteld = $unitels[$countf];

?><tr><?

if ($navid){
?><td><?=number_format($navid[beloeb], 2, ",", ".");?></td><?
$navi_fullbeloeb += $navid[beloeb];
}else{
?><td></td><?
}

if ($uniteld){
?><td><?=number_format($uniteld[beloeb], 2, ",", ".");?></td><?
$unitel_fullbeloeb += $uniteld[beloeb];
}else{
?><td></td><?
}

?></tr><?

$countf++;
}

?><tr><td style="font-size: 1px; padding: 0px;">&nbsp;</td></tr><?

?><tr><?
?><td style="color: red; text-decoration:
underline;"><?=number_format($navi_fullbeloeb, 2, ",", ".");?></td><?
?><td style="color: red; text-decoration:
underline;"><?=number_format($unitel_fullbeloeb, 2, ",", ".");?></td><?
?></tr><?

?><tr><?
?><td style="color: red; text-decoration:
underline;"><?=number_format($d_gf[navi_beloeb], 2, ",", ".");?></td><?
?><td style="color: red; text-decoration:
underline;"><?=number_format($d_gf[unitel_beloeb], 2, ",", ".");?></td><?
?></tr><?

?><tr><td>&nbsp;</td></tr><?
}

echo "Der blev fundet " . $count . " fejl i beløbs-afstemte.";
?>
</table>


--
Mvh Kasper Johansen



Peter Brodersen (10-06-2005)
Kommentar
Fra : Peter Brodersen


Dato : 10-06-05 12:43

On Fri, 10 Jun 2005 13:20:55 +0200, "Kasper Johansen"
<kasper@johansen.tdcadsl.dk> wrote:

>Det første røde felt, er der hvor jeg har talt alle sammen.
>Det næste røde felt, er den SUM() som databasen returnere.
>
>De to summer burde jo meget gerne være det samme, men er det åbenbart ikke?

Hm, det lykkedes mig ikke at få et overblik over din kode ved første
øjekast. Men jeg vil gerne se det direkte SQL-resultat.

Kan du evt. lave en side, hvor du blot afvikler din SQL-query og
præsenterer resultatet i fx en tabel, række for række - uden at du
laver noget præsentationsmagi (fx retter i kommaer og lignende) eller
lignende?

--
- Peter Brodersen

Kasper Johansen (10-06-2005)
Kommentar
Fra : Kasper Johansen


Dato : 10-06-05 13:18

"Peter Brodersen" <usenet2005@ter.dk> skrev i en meddelelse
news:d8bud2$kng$2@news.klen.dk...
> Kan du evt. lave en side, hvor du blot afvikler din SQL-query og
> præsenterer resultatet i fx en tabel, række for række - uden at du
> laver noget præsentationsmagi (fx retter i kommaer og lignende) eller
> lignende?

Jeg har tilføjet et "print_r()" til mit resultat. Dette er de præcise data
der kommer ud af mit query.

Brug "Vis kilde".


--
Mvh Kasper Johansen



Peter Brodersen (10-06-2005)
Kommentar
Fra : Peter Brodersen


Dato : 10-06-05 14:26

On Fri, 10 Jun 2005 14:18:16 +0200, "Kasper Johansen"
<kasper@johansen.tdcadsl.dk> wrote:

>Jeg har tilføjet et "print_r()" til mit resultat. Dette er de præcise data
>der kommer ud af mit query.

Det ser som sådan fint ud - der er ingen tilfælde, hvor navi_beloeb og
unitel_beloeb er de samme, så HAVING-delen i din SQL-forespørgsel
virker.

Der er dog en del tilfælde, hvor unitel_beloeb er lige præcis ti gange
så stort som navi_beloeb, fx:

[0] => 12959
[nr] => 12959
[1] => 24038.25
[navi_beloeb] => 24038.25
[2] => 240382.50
[unitel_beloeb] => 240382.50

[0] => 12978
[nr] => 12978
[1] => 40734.50
[navi_beloeb] => 40734.50
[2] => 407345.00
[unitel_beloeb] => 407345.00

[0] => 12984
[nr] => 12984
[1] => 28094.75
[navi_beloeb] => 28094.75
[2] => 280947.50
[unitel_beloeb] => 280947.50

[0] => 12992
[nr] => 12992
[1] => 19773.75
[navi_beloeb] => 19773.75
[2] => 197737.50
[unitel_beloeb] => 197737.50

[0] => 13000
[nr] => 13000
[1] => 27817.25
[navi_beloeb] => 27817.25
[2] => 278172.50
[unitel_beloeb] => 278172.50

... samt for nr 13007, 13021, 13035, 13045 og 13109.

Det tyder på en sammenhæng. Er det de rækker, der er "problematiske"?


--
- Peter Brodersen

Kasper Johansen (11-06-2005)
Kommentar
Fra : Kasper Johansen


Dato : 11-06-05 15:32

"Peter Brodersen" <usenet2005@ter.dk> skrev i en meddelelse
news:d8c4ds$qah$1@news.klen.dk...
> Det ser som sådan fint ud - der er ingen tilfælde, hvor navi_beloeb og
> unitel_beloeb er de samme, så HAVING-delen i din SQL-forespørgsel
> virker.
> .. samt for nr 13007, 13021, 13035, 13045 og 13109.
>
> Det tyder på en sammenhæng. Er det de rækker, der er "problematiske"?

Problemet er at summen på unitel-beløbene er forkerte. Når jeg tæller dem op
ved hjælp af PHP giver det jo det samme resultat som i navi.

Jeg forstår simpelt ikke hvorfor MySQL ikke lægger dem rigtigt sammen?

--
Mvh Kasper Johansen



Kasper Johansen (11-06-2005)
Kommentar
Fra : Kasper Johansen


Dato : 11-06-05 15:42

"Peter Brodersen" <usenet2005@ter.dk> skrev i en meddelelse
news:d8c4ds$qah$1@news.klen.dk...
> .. samt for nr 13007, 13021, 13035, 13045 og 13109.
>
> Det tyder på en sammenhæng. Er det de rækker, der er "problematiske"?

Grunden til at de lige præcis er ti gange større, er fordi at der er 10
indsætninger i navi-siden.

Det kunne tyde på at MySQL ikke grupere ordentligt, altså unitellen bliver
ganget med ti, fordi kommandoen udføres 10 gange?

Men hvordan omskriver jeg så min GROUP BY, så den ikke gør dette?

--
Mvh Kasper Johansen



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

Månedens bedste
Årets bedste
Sidste års bedste