Topic: lenteles formavimas is skirtingu lenteliu su virsumi

Sveiki,

turiu keleta lentuciu, man jas reikia sujungti ir atvaizduoti kaip paveiksle:
http://majklas.nereal.us/Capture.JPG

lentute likutis:

    pavadinimas     varchar(80)     
    kodas     varchar(30)     
    matas     varchar(15)     
    likutis     float             
    modifikuota     timestamp             
    modifikavo     varchar(35)     
    padalinys     varchar(35)     
    unikalumas     varchar(25)

lentute apyvarta:

    n     int(5)             
    pavadinimas     varchar(55)     
    kodas     varchar(15)     
    kiekis     float             
    Vid_savikaina     float             
    Vid_antkainis_proc     float             
    Vid_antkainis_suma     float             
    padalinys     varchar(20)     
    savaite     int(5)

per kiek uzklausu man geriausia ta lentute suformuoti?
gal as kazkaip ne taip susiprojektaves DB? kazkaip gal lengviau galima?
esamas kodas:

$query="SELECT 
        likuciai.pavadinimas AS pavadinimas,
        likuciai.kodas AS kodas,
        likuciai.matas AS matas,
        likuciai.likutis AS likutis,
        apyvarta.kiekis AS kiekis,
        apyvarta.Vid_savikaina AS Vid_savikaina,
        apyvarta.Vid_antkainis_proc AS Vid_antkainis_proc,
        apyvarta.Vid_antkainis_suma AS Vid_antkainis_suma,
        apyvarta.savaite AS savaite,
        apyvarta.padalinys as padalinys
FROM apyvarta
LEFT JOIN likuciai ON 
                likuciai.kodas = apyvarta.kodas 
            AND likuciai.padalinys = apyvarta.padalinys
WHERE apyvarta.savaite IN ($suformuota_eilute)";

suformuota eilute tai man ivedus pradine ir galutine savaites surenka masyva su , (ivedus 4 ir 6 eilute atrodo 4,5,6)
esme tame, kad reikia ishskaidyti pagal padalinius.. kaip tai padaryti ir atvaizduoti kad padalinys butu virsuje, o prekes isliktu vienoje eiluteje jeigu ir nera ju likuciu lentoje tam tikram padalinyje.

Re: lenteles formavimas is skirtingu lenteliu su virsumi

O padaliniai pas tave pastoviai 3 ar jie gali dažnai keistis?

Tau tikriausiai reikės naudoti "pavertimą" (pivot), kad išgauti tokią ataskaitą.

Re: lenteles formavimas is skirtingu lenteliu su virsumi

minde wrote:

O padaliniai pas tave pastoviai 3 ar jie gali dažnai keistis?

Tau tikriausiai reikės naudoti "pavertimą" (pivot), kad išgauti tokią ataskaitą.

manau kad jie bus iš viso 4 ir daugiau nebus :)
kas yra tas pivot'as? ir kaip jisai mysql'e atrodo?
pirma karta girdziu..

Re: lenteles formavimas is skirtingu lenteliu su virsumi

Paprastai tokie dalykai kaip "likutis" "apyvarta" yra reportų pavadinimai o ne DB lentelės... tokie dalykai paprastai apskaičiuojami ir atvaizduojami o ne saugomi (nebent nėra tokiu lentelių kaip prekė, užsakymas ir pan.)

No warning? No action? I hate this situation!

Re: lenteles formavimas is skirtingu lenteliu su virsumi

Kaip atliekami pavertimai gali pasižiūrėti kitose temose:
http://www.mysql.lt/forumas/viewtopic.php?id=1279
http://www.mysql.lt/forumas/viewtopic.php?pid=7505

Re: lenteles formavimas is skirtingu lenteliu su virsumi

Likučius ir apyvartas galima ir saugoti jeigu: jų išgavimas yra sunkus ir ilgas procesas, jie keičiasi retai, bet dažnai skaitomi (-;

Re: lenteles formavimas is skirtingu lenteliu su virsumi

xeranas wrote:

Paprastai tokie dalykai kaip "likutis" "apyvarta" yra reportų pavadinimai o ne DB lentelės... tokie dalykai paprastai apskaičiuojami ir atvaizduojami o ne saugomi (nebent nėra tokiu lentelių kaip prekė, užsakymas ir pan.)

norint kaupti siuos duomenis reikia traukti i DB ir su jais zaisti, nes jie dingsta ishsitraukus po kazkiek laiko.
likutis ir apyvarta yra is VVS'o istrauktos reiksmes, o si ataskaita reikalinga asmeniniam darbui su uzsakymais :)

Re: lenteles formavimas is skirtingu lenteliu su virsumi

majklas wrote:

norint kaupti siuos duomenis reikia traukti i DB ir su jais zaisti, nes jie dingsta ishsitraukus po kazkiek laiko.
likutis ir apyvarta yra is VVS'o istrauktos reiksmes, o si ataskaita reikalinga asmeniniam darbui su uzsakymais :)

any one help? :)

Re: lenteles formavimas is skirtingu lenteliu su virsumi

#5

10 (edited by majklas 2011-01-10 17:09:48)

Re: lenteles formavimas is skirtingu lenteliu su virsumi

minde wrote:

#5

SELECT dept,
COUNT(CASE
WHEN gender = 'm' THEN id ELSE NULL END) AS m,
COUNT(CASE WHEN gender = 'f' THEN id ELSE NULL END) AS f,
COUNT(*) AS total
FROM person
GROUP BY dept

radau as cia: http://datacharmer.org/downloads/pivot_ … ysql_5.pdf

grazina:

+------------------+
| dept by gender |
+------------------+
| dept | m | f | total |
+-----+--+--+--+
| dev | 1 | 1 | 2 |
| pers | 3 | 1 | 4 |
| sales | 2 | 1 | 3 |
+-------------------+

is jusu pavyzdziu nelabai suprantu kaip man pritaikyti konkreciu atveju ir kaip tie stulpeliai formuojami arba varstomi.. :(
kur kokias funkcijas naudoti, nes net nezinau kaip ieskoti informacijos googlej :S

Re: lenteles formavimas is skirtingu lenteliu su virsumi

is jusu pavyzdziu nelabai suprantu kaip man pritaikyti konkreciu atveju ir kaip tie stulpeliai formuojami arba varstomi.. :(
kur kokias funkcijas naudoti, nes net nezinau kaip ieskoti informacijos googlej :S

šitas tikrai geas paaiškinimas: http://datacharmer.org/downloads/pivot_ … ysql_5.pdf

Jeigu reikia daugiau:
http://en.wikibooks.org/wiki/MySQL/Pivot_table
http://dev.mysql.com/tech-resources/art … index.html

Skaityk, mokykis (-;

12 (edited by majklas 2011-01-10 17:39:25)

Re: lenteles formavimas is skirtingu lenteliu su virsumi

minde wrote:

is jusu pavyzdziu nelabai suprantu kaip man pritaikyti konkreciu atveju ir kaip tie stulpeliai formuojami arba varstomi.. :(
kur kokias funkcijas naudoti, nes net nezinau kaip ieskoti informacijos googlej :S

šitas tikrai geas paaiškinimas: http://datacharmer.org/downloads/pivot_ … ysql_5.pdf

Jeigu reikia daugiau:
http://en.wikibooks.org/wiki/MySQL/Pivot_table
http://dev.mysql.com/tech-resources/art … index.html

Skaityk, mokykis (-;

tuos jau ir taip praverciau...
man visu pirmiausia neaisku kaip php'e atvaizduoti ta savo select'a su  GROUP_CONCAT(apyvarta.padalinys) as Padaliniai
kas man per PMA rodo kaip visus padalinius (PHP'e turetu buti stulpeliu pavadinimai..)
antra, man nereikia nieko sumuoti arba pavadinimo raides traukti..
nesuprantu as pacios esmes ir kaip is ko padaro ta pivot'a..
jau 4h skaitau doc'us o naudos 0..
as juk ne programuotojas ar db architektas.. :(
va PMA ka grazina:
http://majklas.nereal.us/Capture2.JPG
su kodu:

SELECT 
        likuciai.pavadinimas AS pavadinimas,
        likuciai.kodas AS kodas,
        likuciai.matas AS matas,
        likuciai.likutis AS likutis,
        apyvarta.kiekis AS kiekis,
        apyvarta.Vid_savikaina AS Vid_savikaina,
        apyvarta.Vid_antkainis_proc AS Vid_antkainis_proc,
        apyvarta.Vid_antkainis_suma AS Vid_antkainis_suma,
        apyvarta.savaite AS savaite,
        apyvarta.padalinys as padalinys,
        GROUP_CONCAT(apyvarta.padalinys) as Padaliniai
FROM apyvarta
LEFT JOIN likuciai ON 
                likuciai.kodas = apyvarta.kodas 
            AND likuciai.padalinys = apyvarta.padalinys
WHERE apyvarta.savaite IN ($suformuota_eilute)
GROUP BY apyvarta.pavadinimas

Re: lenteles formavimas is skirtingu lenteliu su virsumi

Tai esmė tame, kad viskas atliekama ne su PHP, o pačioje DBVS (šiuo atveju MySQL). Kitaip sakant duomenis iš eilučių SQL pagalba galima sudėlioti į reikiamus stulpelius. Apie tai mano duotose nuorodose ir kalbama. Turi atidžiai paskaityt, kad suprastum (-;

Re: lenteles formavimas is skirtingu lenteliu su virsumi

minde wrote:

Tai esmė tame, kad viskas atliekama ne su PHP, o pačioje DBVS (šiuo atveju MySQL). Kitaip sakant duomenis iš eilučių SQL pagalba galima sudėlioti į reikiamus stulpelius. Apie tai mano duotose nuorodose ir kalbama. Turi atidžiai paskaityt, kad suprastum (-;

jo, ciuju ant gero greblio cia uzhsiroviau
tiek to, man cia per sunku...

Re: lenteles formavimas is skirtingu lenteliu su virsumi

Na ten nėr labai sunku, reikia tik įsigilint. Man nėra tikslo perrašyti tai, kas jau parašyta. čia nebent tema blog'ui kokiam, nes reikia viską pakankamai gerai ir aiškiai išdėstyti, kad kas nors suprastų (-; čia ne vienos forumo žinutės klausimas.

Re: lenteles formavimas is skirtingu lenteliu su virsumi

Pas tave GROUP_CONCAT() kaip suprantu nereikalingas. Tu turi savo gautus duomenis grupuoti pagal padalinį, ir tada formuoti stulpelius, o duomenis į tuos stulpelis atrinkinėti su IF pagal padalinio pavadinimą.

Priklausomai nuo situacijos (į tavąją labai nesigilinau) gali tekti viską atlikti per pora vidinių/išorinių užklausų.

Re: lenteles formavimas is skirtingu lenteliu su virsumi

minde wrote:

Pas tave GROUP_CONCAT() kaip suprantu nereikalingas. Tu turi savo gautus duomenis grupuoti pagal padalinį, ir tada formuoti stulpelius, o duomenis į tuos stulpelis atrinkinėti su IF pagal padalinio pavadinimą.

Priklausomai nuo situacijos (į tavąją labai nesigilinau) gali tekti viską atlikti per pora vidinių/išorinių užklausų.

ok, aciu uz pagalba, rytoj bandysiu kazka darytis.. o kaip man atvaizduoti su PHP ?
nes as tos lenteles nemoku atvaizduoti su html tagais kai reikia dar ir virsu nupiesti..
ir kokiu butu tas uzklausas formuoti kad gauti 4 kartus ta pati tik pagal padalini su ta pacia preke.. :(

Re: lenteles formavimas is skirtingu lenteliu su virsumi

gal trumpai kazka help? :)
laikas senka, o toliau sedeti ant sito dziaugsmo yra per daug brangu ;/

Re: lenteles formavimas is skirtingu lenteliu su virsumi

SELECT likuciai.pavadinimas AS pavadinimas,
   likuciai.kodas AS kodas,
   likuciai.matas AS matas,
   likuciai.likutis AS likutis,
   MAX(IF(apyvarta.padalinys = 'MC', apyvarta.kiekis, NULL)) AS MC_kiekis,
   MAX(IF(apyvarta.padalinys = 'MC', apyvarta.Vid_savikaina)) AS MC_Vid_savikaina,
   MAX(IF(apyvarta.padalinys = 'MC', apyvarta.Vid_antkainis_proc)) AS MC_Vid_antkainis_proc,
(...)
   MAX(IF(apyvarta.padalinys = 'UB', apyvarta.kiekis, NULL)) AS UB_kiekis,
   MAX(IF(apyvarta.padalinys = 'UB', apyvarta.Vid_savikaina)) AS UB_Vid_savikaina,
   MAX(IF(apyvarta.padalinys = 'UB', apyvarta.Vid_antkainis_proc)) AS UB_Vid_antkainis_proc,
(...)
FROM apyvarta
   LEFT JOIN likuciai ON likuciai.kodas = apyvarta.kodas 
      AND likuciai.padalinys = apyvarta.padalinys
WHERE apyvarta.savaite IN ($suformuota_eilute)
GROUP BY apyvarta.pavadinimas

Re: lenteles formavimas is skirtingu lenteliu su virsumi

aciu minde, tu nerealus :)
gal zinai kaip dar padaryti gale TOTAL?
su SUM bandziau bet nesigauna.. :(

SELECT apyvarta.pavadinimas AS pavadinimas,
   apyvarta.kodas AS kodas,
   likuciai.matas AS matas,
   MAX(IF(likuciai.padalinys = 'MC', likuciai.likutis, NULL)) AS MC_likutis,
   MAX(IF(apyvarta.padalinys = 'MC', apyvarta.kiekis, NULL)) AS MC_kiekis,
   MAX(IF(apyvarta.padalinys = 'MC', apyvarta.Vid_savikaina, NULL)) AS MC_Vid_savikaina,
   MAX(IF(apyvarta.padalinys = 'MC', apyvarta.Vid_antkainis_proc, NULL)) AS MC_Vid_antkainis_proc,
   MAX(IF(apyvarta.padalinys = 'MC', apyvarta.Vid_antkainis_suma, NULL)) AS MC_Vid_antkainis_proc,
   
   MAX(IF(likuciai.padalinys = 'UB', likuciai.likutis, NULL)) AS UB_likutis,
   MAX(IF(apyvarta.padalinys = 'UB', apyvarta.kiekis, NULL)) AS UB_kiekis,
   MAX(IF(apyvarta.padalinys = 'UB', apyvarta.Vid_savikaina, NULL)) AS UB_Vid_savikaina,
   MAX(IF(apyvarta.padalinys = 'UB', apyvarta.Vid_antkainis_proc, NULL)) AS UB_Vid_antkainis_proc,
   MAX(IF(apyvarta.padalinys = 'UB', apyvarta.Vid_antkainis_suma, NULL)) AS UB_Vid_antkainis_proc,
   
   MAX(IF(likuciai.padalinys = 'KA', likuciai.likutis, NULL)) AS KA_likutis,
   MAX(IF(apyvarta.padalinys = 'KA', apyvarta.kiekis, NULL)) AS KA_kiekis,
   MAX(IF(apyvarta.padalinys = 'KA', apyvarta.Vid_savikaina, NULL)) AS Ka_Vid_savikaina,
   MAX(IF(apyvarta.padalinys = 'KA', apyvarta.Vid_antkainis_proc, NULL)) AS KA_Vid_antkainis_proc,
   MAX(IF(apyvarta.padalinys = 'KA', apyvarta.Vid_antkainis_suma, NULL)) AS KA_Vid_antkainis_proc
FROM apyvarta
   LEFT JOIN likuciai ON likuciai.kodas = apyvarta.kodas 
      AND likuciai.padalinys = apyvarta.padalinys
WHERE apyvarta.savaite IN (1,2,3,4,5)
GROUP BY apyvarta.pavadinimas
Limit 0 , 999