|
[ 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.
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|