Topic: GROUP uzklausa, iterpiant neegzistuojancius rezultatus

SELECT to_char(order_creation_date, 'YYYY-MM-DD') AS diena,
  avg(resolut_duration_hours), dep
FROM cache
WHERE order_creation_date::date >= NOW() - INTERVAL '7 DAY'
  AND tag = 'T' and duration_hours < '48'
GROUP BY diena, dep 
ORDER BY diena asc

OUTPUT:

Array
(
    [diena] => 2012-11-24
    [avg] => 5.40454251461988
    [dep] => pirmas
)
Array
(
    [diena] => 2012-11-24
    [avg] => 21.1284629761905
    [dep] => antras
)
Array
(
    [diena] => 2012-11-25
    [avg] => 30.4637633730159
    [dep] => pirmas
)

2012-11-25 diena buvo aktyvus tik pirmas skyrius (dep), todel antro skyriaus rezultatu nera, taciau man reiktu kad grazintu 0 t.y

Array
(
    [diena] => 2012-11-25
    [avg] => 0
    [dep] => antras
)

Re: GROUP uzklausa, iterpiant neegzistuojancius rezultatus

Jeigu žiūrėt grynai iš MySQL/SQL logikos, tai jeigu nėra įrašo, tai jis ir negražinamas.

Pirmas būdas: įterpk tą nulinį įrašą, ir viskas bus OK (-;
Antras būdas: departamentų sąrašą LEFT JOIN'inink su šiais duomenimis ir tu jau visiem departamentam kažką turėsi, jeigu nebuvo duomenų - turėsi NULL, bet tai jau galėsi kažkaip panaudodamas gauni 0;

(jeigu nėra departamentų lentelės, tai gali naudoti užklausą kaip laikiną lentelė, kuri iš turimų duomenų išskaičiuoja visus departamentus)

Re: GROUP uzklausa, iterpiant neegzistuojancius rezultatus

Negaliu as iterpti ir modifikuoti esamos strukturos :) departmentai tik du kaip ir minejau pirmas, antras :) meginau kazka apjungti kiek kitaip su datom, bet nelabai gavosi. Taip ar 0 ar null nesvarbu, svarbu kad grazintu kazka

Re: GROUP uzklausa, iterpiant neegzistuojancius rezultatus

Na tai bandyk su "antras būdas".

Re: GROUP uzklausa, iterpiant neegzistuojancius rezultatus

Nesigauna, ta pati rezultata gaunu, matyt kazka blogai darau :/

Re: GROUP uzklausa, iterpiant neegzistuojancius rezultatus

AsMike wrote:

Nesigauna, ta pati rezultata gaunu, matyt kazka blogai darau :/

Parodyk užklausą, su kuria bandai.

Re: GROUP uzklausa, iterpiant neegzistuojancius rezultatus

Gal perdaug nugrybavau - baisu rodyt :)

departmenta su joininau su ta pacia lentele ir tiek, logiskai galvojant kazko truksta (taipogi ir ziniu man :))

Re: GROUP uzklausa, iterpiant neegzistuojancius rezultatus

Jo, jeigu BAISU rodyt, tai tada ir BAISU programuoti... manau mūsų jau nebeišgasdinsi. Tiesiog nematant sunku pakomentuoti, ką darai blogai.

Tu turi pasirašyti užklausą, kurio pagalba išgauni abu departamentus. O jeigu reikia ir kažkokias tai datas (kadangi tiksliai nežinau ko tau reikia, tai tiksliai negaliu ir komentuoti).

Tą gautą užklausą, jau tada gali LEFT JOIN'ininti su duomenimis, apjungiant pagal deparamento pavadinima, ir, jeigu reikia, pagal datą. Atitinkamai dešinėje pusėje nesant duomenims, bus sukurti tušti įrašai.

Re: GROUP uzklausa, iterpiant neegzistuojancius rezultatus

AsMike wrote:

Gal perdaug nugrybavau - baisu rodyt :)

departmenta su joininau su ta pacia lentele ir tiek, logiskai galvojant kazko truksta (taipogi ir ziniu man :))

sujoininai kaip?

nes left join (esminis zodis - left) leidzia parodyti visus rezultatus, iskaitant ir tuscius (NULL).

Re: GROUP uzklausa, iterpiant neegzistuojancius rezultatus

SELECT to_char(a.order_creation_date, 'YYYY-MM-DD') AS diena, count(a.ord_id) AS ivykiai, avg(a.duration_hours), a.dep
FROM cache a
LEFT JOIN cache s ON a.dep = s.dep and to_char(a.order_creation_date, 'YYYY-MM-DD') = to_char(s.order_creation_date, 'YYYY-MM-DD') 
WHERE a.order_creation_date::date >= NOW() - INTERVAL '7 DAY' and a.tag = 'T' and duration_hours < '48' 
GROUP BY diena, a.dep 
ORDER BY diena asc

Re: GROUP uzklausa, iterpiant neegzistuojancius rezultatus

Tu čia jungi konkrečiai cache lentelę su pačia savim. Vietoje pirmos cache lentelės, tu turi įrašyt visą SQL užklausą (SELECT ... FROM cache WHERE ...), kurios rezultatas yra dvi eilutės: du departamentai.

Re: GROUP uzklausa, iterpiant neegzistuojancius rezultatus

SELECT to_char(a.order_creation_date, 'YYYY-MM-DD') AS diena,
count(a.ord_id) AS ivykiai,
avg(a.duration_hours), a.dep
FROM (
   select to_char(order_creation_date, 'YYYY-MM-DD') AS diena,
   dep
FROM cache
WHERE order_creation_date::date >= NOW() - INTERVAL '7 DAY' and tag = 'T' and duration_hours < '48'
g roup by diena, dep
) a LEFT JOIN cache s ON a.dep = s.dep and to_char(a.order_creation_date, 'YYYY-MM-DD') = to_char(s.order_creation_date, 'YYYY-MM-DD') 
WHERE a.order_creation_date::date >= NOW() - INTERVAL '7 DAY' and a.tag = 'T' and a.duration_hours < '48'
GROUP BY diena, a.dep
ORDER BY diena

Klaidu meta, kad neegzistuoja stulpelis order_creation_date,
ir matyt, antros where salygos nereikia..

Re: GROUP uzklausa, iterpiant neegzistuojancius rezultatus

Na laikinojoje lentoje "a" (užklauos rezultate) ir nebėra tokio stulpelio, yra tik du stulpeliei: diena ir dep.

Re: GROUP uzklausa, iterpiant neegzistuojancius rezultatus

Teisybe. Gaunu tapati rezultata, koki gaudavau priestais:

SELECT diena,
 a.dep, count(ord_id)
FROM 
(
select to_char(order_creation_date, 'YYYY-MM-DD') AS diena, dep, count(ord_id)
FROM cache
WHERE order_creation_date::date >= NOW() - INTERVAL '7 DAY' and tag = 'T' and duration_hours < '48' 
group by diena, dep
) 
a LEFT JOIN cache s ON a.dep = s.dep and diena = to_char(s.order_creation_date, 'YYYY-MM-DD') 
GROUP BY diena, a.department
ORDER BY diena

T.y reikiamo nulio vistiek negaunu..