[ cesare @ 19.05.2013. 12:12 ] @
Pozdrav svima !!!!!

Napravio sam dve tabele tblgrane i tblkupci. tblgrane ima polja IdBroj,NIdBroj,Naziv..., a u tblkupci se nalazi spisak kupaca (firmi) koje pripadaju nekoj od grana i vrednosti njihovih kupovina(polja: IdBroj,Grana,Naziv,VrednostKupovine - polje Grana je IdBroj iz tabele tblgrane). U tblgrane NIdBroj je IdBroj neke od grana iz iste tabele koja je nadređena toj grani. Root grane u polju NIdBroj imaju vrednost 0. Ono što bih želeo je da u jednom upitu, bez pisanja procedure, zbrojim (saberem) vrednosti kupovina kupaca, tako da zbirovi kupovina budu grupisani prema root granama. Da li je ovo moguće i kako?

Unapred hvala...
[ bogdan.kecman @ 19.05.2013. 12:19 ] @
da si stavio dump tako da vidimo create i da si dodao melo neke dummy date mozda bi dobio i ceo upit ovako

select sum(vrednost_kupovine) from t1 where user_id= xx group by grana

generalno ne mozes da grupises i po useru i po toj grani, dakle upit ti vraca za jednog usera sume grupisane po grani ... e sad, ti to mozes da napravis subselect da ti to racuna za svakog usera mada je pitanje da li ti to treba
[ cesare @ 19.05.2013. 12:46 ] @
Code:


[u]TBLGRANE[/u]

IdBroj           NIdBroj        Naziv

1                 0                Grana 1
2                 0                Grana 2
3                 0                Grana 3
4                 1                Grana 4
5                 1                Grana 5
6                 4                Grana 6


[u]TBLKUPCI[/u]

IdBroj           Grana         Naziv                VrednostKupovine

1                  2              Kupac 1             100
2                  3              Kupac 2             200
3                  4              Kupac 3             200
4                  5              Kupac 4             100
5                  6              Kupac 5             200



[u]TBLREZULTAT[/u] bi trebalo da izgleda ovako

IdBrojGrane      NazivGrane     VrednostKupovine

1                    Grana 1          500                  (Kupac 3 + Kupac 4 + Kupac 5)
2                    Grana 2          100                  (Kupac 1)
3                    Grana 3          200                  (Kupac 2)

[ bogdan.kecman @ 19.05.2013. 13:13 ] @
to nije dump, to niko ne moze da c/p u mysql pa da proba upit
[ cesare @ 19.05.2013. 13:24 ] @
Evo dump-a...

Code:


SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `tblgrane`
-- ----------------------------
DROP TABLE IF EXISTS `tblgrane`;
CREATE TABLE `tblgrane` (
  `IdBroj` char(2) COLLATE utf8_slovenian_ci NOT NULL,
  `NIdBroj` char(2) COLLATE utf8_slovenian_ci NOT NULL,
  `Naziv` char(20) COLLATE utf8_slovenian_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_slovenian_ci;

-- ----------------------------
-- Records of tblgrane
-- ----------------------------
INSERT INTO `tblgrane` VALUES ('1', '0', 'Grana 1');
INSERT INTO `tblgrane` VALUES ('2', '0', 'Grana 2');
INSERT INTO `tblgrane` VALUES ('3', '0', 'Grana 3');
INSERT INTO `tblgrane` VALUES ('4', '1', 'Grana 4');
INSERT INTO `tblgrane` VALUES ('5', '1', 'Grana 5');
INSERT INTO `tblgrane` VALUES ('6', '4', 'Grana 6');

-- ----------------------------
-- Table structure for `tblkupci`
-- ----------------------------
DROP TABLE IF EXISTS `tblkupci`;
CREATE TABLE `tblkupci` (
  `IdBroj` char(2) COLLATE utf8_slovenian_ci NOT NULL,
  `Grana` char(2) COLLATE utf8_slovenian_ci NOT NULL,
  `Naziv` char(20) COLLATE utf8_slovenian_ci NOT NULL,
  `VrednostKupovine` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_slovenian_ci;

-- ----------------------------
-- Records of tblkupci
-- ----------------------------
INSERT INTO `tblkupci` VALUES ('1', '2', 'Kupac 1', '100');
INSERT INTO `tblkupci` VALUES ('2', '3', 'Kupac 2', '200');
INSERT INTO `tblkupci` VALUES ('3', '4', 'Kupac 3', '200');
INSERT INTO `tblkupci` VALUES ('4', '5', 'Kupac 4', '100');
INSERT INTO `tblkupci` VALUES ('5', '6', 'Kupac 5', '200');

[ bantu @ 20.05.2013. 10:26 ] @
Code:

SELECT k.Grana, g.Naziv, SUM(k.VrednostKupovine)
FROM tblkupci k LEFT OUTER JOIN tblgrane g ON k.Grana = g.idbroj
GROUP BY Grana;
[ cesare @ 20.05.2013. 14:31 ] @
bantu -> rezultat bi trebalo da izgleda ovako:

Code:


IdBrojGrane      NazivGrane     VrednostKupovine

1                    Grana 1          500                  (Kupac 3 + Kupac 4 + Kupac 5)
2                    Grana 2          100                  (Kupac 1)
3                    Grana 3          200                  (Kupac 2)



tvojim upitom se dobija isti rezultat kao što je tabela tblkupci.
[ bantu @ 21.05.2013. 07:24 ] @
Slična ali ne ista, sumira se po grani. Imaš malo podataka pa ti nije baš jasno.
Pored toga, šta je IdBrojGran, to nema u dump-u nigdje. Ja sam prepostavio da mislis na tblgrane.IdBroj.

Ovo ispod je izlaz. Pokaži mi na osnovu ovih podataka ispod šta nije tačno? Gdje su ti grane 4, 5 i 6? Imaš granu 1 a za nju nemaš ni jednu vrijednost kupovine.

Code:

mysql> select * from tblgrane;
+--------+---------+---------+
| IdBroj | NIdBroj | Naziv   |
+--------+---------+---------+
| 1      | 0       | Grana 1 |
| 2      | 0       | Grana 2 |
| 3      | 0       | Grana 3 |
| 4      | 1       | Grana 4 |
| 5      | 1       | Grana 5 |
| 6      | 4       | Grana 6 |
+--------+---------+---------+
6 rows in set (0.00 sec)


mysql> select * from tblkupci;
+--------+-------+---------+------------------+
| IdBroj | Grana | Naziv   | VrednostKupovine |
+--------+-------+---------+------------------+
| 1      | 2     | Kupac 1 |              100 |
| 2      | 3     | Kupac 2 |              200 |
| 3      | 4     | Kupac 3 |              200 |
| 4      | 5     | Kupac 4 |              100 |
| 5      | 6     | Kupac 5 |              200 |
+--------+-------+---------+------------------+
5 rows in set (0.01 sec)



mysql> SELECT k.Grana, g.Naziv, SUM(k.VrednostKupovine)
    -> FROM tblkupci k LEFT OUTER JOIN tblgrane g ON k.Grana = g.idbroj
    -> GROUP BY Grana;
+-------+---------+-------------------------+
| Grana | Naziv   | SUM(k.VrednostKupovine) |
+-------+---------+-------------------------+
| 2     | Grana 2 |                     100 |
| 3     | Grana 3 |                     200 |
| 4     | Grana 4 |                     200 |
| 5     | Grana 5 |                     100 |
| 6     | Grana 6 |                     200 |
+-------+---------+-------------------------+
5 rows in set (0.00 sec)
[ cesare @ 21.05.2013. 09:42 ] @
TBLGRANE izgleda ovako

Code:


IdBroj           NIdBroj        Naziv

1                 0                Grana 1
2                 0                Grana 2
3                 0                Grana 3
4                 1                Grana 4
5                 1                Grana 5
6                 4                Grana 6



što znači da je Grana6 podređena grani Grana4, a Grana4 i Grana5 su podređene grani Grana1. Pošto Grana1, Grana2 i Grana3 imaju NIdBroj 0, što znači da su one root grane, zadatak je prikazati zbirove kupovina po njima. Zato rezultat i treba da izgleda ovako:

Code:


IdBrojGrane      NazivGrane     VrednostKupovine

1                    Grana 1          500                  (Kupac 3 + Kupac 4 + Kupac 5)
2                    Grana 2          100                  (Kupac 1)
3                    Grana 3          200                  (Kupac 2)



IdBrojGrane u rezultatu je u stvari tblgrane.IdBroj.
[ bantu @ 21.05.2013. 10:38 ] @
Teško ćeš to da riješiš upitom budući da je moguće da postoji beskonačno mnogo podgrana.
npr.
Code:

INSERT INTO `tblgrane` VALUES ('7', '6', 'Grana 7');
INSERT INTO `tblgrane` VALUES ('8', '7', 'Grana 8');
INSERT INTO `tblgrane` VALUES ('9', '8', 'Grana 9');
INSERT INTO `tblgrane` VALUES ('10', '9', 'Grana 10');
...


To je najbolje riještiti u aplikaciji, nekom rekurzijom.
[ tarla @ 21.05.2013. 15:44 ] @
Ja uvijek organizaciju grana radim "nested" (http://ftp.nchu.edu.tw/MySQL/t...rticles/hierarchical-data.html)

Rekurzije mogu trajati u vječnost, svaka dodatna grana eksponencijalno komplikuje upite..
[ bantu @ 22.05.2013. 07:18 ] @
Skroz tačno.
Samo ja rekurziju rijetko pustim da ide u nedogled, obično kao jedan paretar prosljeđjujem level koji pri svakom pozivu dekrementujem i ne idem dalje od 0.
[ bantu @ 22.05.2013. 08:09 ] @
Mada ovaj Nested Set Model je najkompletniji.
[ bogdan.kecman @ 30.05.2013. 09:31 ] @
rekurzija je mega pogresan nacin za resavanje tog problema, vec pri malim dubinama upiti se vise ne izvrsavaju u realnom vremenu
[ bantu @ 03.06.2013. 07:15 ] @
Nisam imao na umu da u rekurziji izvršavam upite, nego već pribavljene podatke da rekurzijom organizujem u neku strukturu.