MacMinds - great minds think different

Navigatie

Zoeken

Inloggegevens

Je bent niet ingelogd.


#1 05-06-2011 11:46

kluivers
@ Amsterdam
Geregistreerd: 18-09-2006

SQL Left outer join condition on right.

Beste mensen,

Ik zit met een SQL vraagje. Ik heb twee tabellen, 1 met winkels behorende bij een keten & 1 met het grootboek van transacties per winkel.

Nu wil ik het transactie saldo aan het einde van de maand weten door een sommatie te doen van alle transacties tot aan maand x. Echter, ik wil wel graag in het overzicht alle winkels weergeven, ook als deze op moment x nog geen transacties had. Het resultaat moet dan 0 zijn.

Ik dacht deze doet 't wel.

Code:

SELECT winkel_id, (SUM(ontvangen) - SUM(uitgegeven)) as balans
FROM winkel LEFT OUTER JOIN transacties ON (winkel_id )
WHERE  winkel.keten = 'kleine_keten_met_zeg_5_deelnemers'
AND DATE_FORMAT(transacties.timestamp, '%c-%Y') <= DATE_FORMAT((NOW() - INTERVAL 0 MONTH), '%c-%Y')
GROUP BY winkel_id

Maar helaas, enkel rijen met transacties. Waar het in mijn beleving fout gaat is bij de WHERE clause. Deze limiteert op de rechter tabel maar als daar nix inzit dan komt hij met nix terug. En dan bedoel ik niet 0.

Hoe kan ik dit nou wel in SQL oplossen? Ga nu in PHP een array d'r tegenaan gooien maar dat wil ik eigenlijk liever niet.


Ha ! Gezellig.

Offline

 

#2 05-06-2011 13:59

HSL
Beheerder
@ Amsterdam
Geregistreerd: 30-07-2006
Website

Re: SQL Left outer join condition on right.

Dit wil je niet in SQL doen,.. dus maak in PHP een voorbeeld array met alle waardes 0 en loop dan door de SQL resultaten heen.

smile

Ik heb dit laatst ook gedaan met data uit SQL:

Code:

function formatDates( $data,$startdate,$enddate,$showby,$type  )
{
    $newdate = dateRange( $startdate,$enddate,$type,$showby );
    
    foreach( $newdate as $key => $date ):
        foreach( $data as $sqldate ):
            if($showby == 'day'):
                if( $date['year'] == $sqldate->year && $date['month'] == $sqldate->month && $date['day'] == $sqldate->day ):
                    if( $sqldate->value == null):
                        $newdate[$key]['value'] = 0;
                    else:
                        $newdate[$key]['value'] = $sqldate->value;
                    endif;
                endif;
            elseif($showby == 'week'):
                if( $date['year'] == $sqldate->year && $date['week'] == $sqldate->week ):
                    if( $sqldate->value == null):
                        $newdate[$key]['value'] = 0;
                    else:
                        $newdate[$key]['value'] = $sqldate->value;
                    endif;
                endif;
            elseif($showby == 'month'):
                if( $date['year'] == $sqldate->year && $date['month'] == $sqldate->month ):
                    if( $sqldate->value == null):
                        $newdate[$key]['value'] = 0;
                    else:
                        $newdate[$key]['value'] = $sqldate->value;
                    endif;
                endif;
            endif;
            $lastkey = $key;
        endforeach;
    endforeach;
    
    return $newdate;
}

Offline

 

#3 06-06-2011 12:56

tennapel
Pro
@ Rotterdam
Geregistreerd: 18-08-2006
Website

Re: SQL Left outer join condition on right.

Dat wil je absoluut wel met SQL doen, vele malen sneller dan een PHP array.

Je sql klopt alleen niet volledig, dit zou moeten werken (ongetest, dus uit het blote bolletje):

Code:

SELECT    winkel_id
,     coaslesce(SUM(ontvangen),0) - coalesce(SUM(uitgegeven),0) as balans
FROM     winkel w
LEFT JOIN transacties t 
    ON w.winkel_id = t.winkel_id
    AND DATE_FORMAT(t.timestamp, '%c-%Y') <= DATE_FORMAT((NOW() - INTERVAL 0 MONTH), '%c-%Y')
WHERE      w.winkel.keten = 'kleine_keten_met_zeg_5_deelnemers'
GROUP BY w.winkel_id

Life is a stage, but the play is badly cast * Oscar Wilde

Offline

 

#4 14-06-2011 22:58

kluivers
@ Amsterdam
Geregistreerd: 18-09-2006

Re: SQL Left outer join condition on right.

Long time no read maar het antwoord is er weer niet minder om wink.

Ik had hem onderhand al met PHP afgevangen (evengoed wel dank voor de uitvoerige uiteenzetting HSL) maar ik ga alsnog even de query proberen.

Overigens, deze

Code:

 coaslesce()

is er wel 1 om te onthouden!

Handy! Dank weer tennapel.

jw


Ha ! Gezellig.

Offline

 

Forum voettekst

MacMinds v 1.05 Powered by PunBB