[ dsivic @ 08.06.2012. 18:23 ] @
Code:



/********************************************************

Zdravo svima,
 
U tabeli ispod je suma koliko je svaki radnik nabrao nekog proizvoda.

Moze li se ovakav prikaz dobiti samo pomoću SQL-a, ako dođe još jedan proizvod da se automatski uključi, to također važi i za novog radnika

PS: inace radim nesto u php-u, i rijesio sam to kroz petlje i vise upita...

********************************************************/



| radnik    | proizvod1 | proizvod2 | proizvod3 |itd    |
+-----------+-----------+-----------+-------------------+
| ImePrezime| 12        | 21        | 1         | 68    |
+-----------+-----------+-----------+-----------+-------+
| ImePrezime| 23        | 16        | 44        | 18    |
+-----------+-----------+-----------+-----------+-------+
| ImePrezime| 17        | 19        | 33        | 28    |
+-----------+-----------+-----------+-----------+-------+
| ImePrezime| 17        | 33        | 4         | 18    |
+-----------+-----------+-----------+-----------+-------+


/*tabela radnik*/

CREATE TABLE `radnik` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `naziv` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
INSERT INTO `radnik` VALUES ('1', 'ImePrezime1');
INSERT INTO `radnik` VALUES ('2', 'ImePrezime2');
INSERT INTO `radnik` VALUES ('3', 'ImePrezime3');
INSERT INTO `radnik` VALUES ('4', 'ImePrezime4');
INSERT INTO `radnik` VALUES ('6', 'ImePrezime5');


/*tabela proizvod*/
CREATE TABLE `proizvod` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `naziv` varchar(255) NOT NULL,
  `tezina` double(7,3) NOT NULL DEFAULT '0.000',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

INSERT INTO `proizvod` VALUES ('1', 'Proizvod 1', '0.350');
INSERT INTO `proizvod` VALUES ('2', 'Proizvod 2', '2.000');
INSERT INTO `proizvod` VALUES ('3', 'Proizvod 3', '0.350');
INSERT INTO `proizvod` VALUES ('4', 'Proizvod 4', '0.350');




/*tabela magacin*/
CREATE TABLE `magacin` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `radnik_id` int(11) NOT NULL,
  `proizvod_id` int(11) NOT NULL,
  `kolicina` double(10,3) NOT NULL DEFAULT '0.000'
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=38 DEFAULT CHARSET=utf8;
INSERT INTO `magacin` VALUES ('1', '1', '1', '0.350');
INSERT INTO `magacin` VALUES ('2', '1', '1', '0.350');
INSERT INTO `magacin` VALUES ('3', '1', '2', '2.000');
INSERT INTO `magacin` VALUES ('4', '1', '1', '0.350');
INSERT INTO `magacin` VALUES ('5', '1', '2', '2.000');
INSERT INTO `magacin` VALUES ('6', '1', '4', '0.350');
INSERT INTO `magacin` VALUES ('7', '2', '1', '0.350');
INSERT INTO `magacin` VALUES ('8', '2', '3', '0.350');
INSERT INTO `magacin` VALUES ('9', '2', '4', '0.700');
INSERT INTO `magacin` VALUES ('10', '2', '4', '0.350');
INSERT INTO `magacin` VALUES ('11', '3', '1', '0.350');
INSERT INTO `magacin` VALUES ('12', '3', '3', '0.350');
INSERT INTO `magacin` VALUES ('13', '3', '3', '0.350');
INSERT INTO `magacin` VALUES ('14', '3', '3', '0.350');
INSERT INTO `magacin` VALUES ('15', '3', '4', '1.050');
INSERT INTO `magacin` VALUES ('16', '3', '4', '0.700');
INSERT INTO `magacin` VALUES ('17', '4', '1', '0.350');
INSERT INTO `magacin` VALUES ('18', '4', '1', '0.350');
INSERT INTO `magacin` VALUES ('19', '4', '3', '0.350');
INSERT INTO `magacin` VALUES ('20', '4', '4', '0.350');
INSERT INTO `magacin` VALUES ('35', '2', '1', '0.350');
INSERT INTO `magacin` VALUES ('36', '3', '1', '0.350');
INSERT INTO `magacin` VALUES ('37', '4', '1', '0.350');

[ Igor Gajic @ 08.06.2012. 18:37 ] @
Hm... Ovako nesto ?


Code (sql):

SELECT r.naziv, p.naziv, SUM(kolicina) AS Total
FROM magacin m
JOIN radnik r ON r.id = m.radnik_id
JOIN proizvod p ON p.id = m.proizvod_id
GROUP BY m.radnik_id, m.proizvod_id;
 



[ djoka_l @ 08.06.2012. 18:43 ] @
Evo jednog rešenja: http://www.databasejournal.com...d-Rows-in-Crosstab-Queries.htm
To što ti tražiš, zovu se pivot tabele, a u MySQL se postižu kroz "trikove" kao u gornjem primeru.
Uvek je bolje rešenje da napraviš jednostavan upit, a onda u PHP-u da odradiš formatiranje...
[ dsivic @ 08.06.2012. 18:43 ] @
@Igor Gajic

Obrati pažnju da tabela (razultat koji dobijemo od mysql-a) mora izgledati kao u primjeru...
[ Igor Gajic @ 08.06.2012. 18:46 ] @
Aggregate table su dobre ako imas predefinisan broj kolona. U ovom slucaju broj proizvoda je proizvoljan tako da bi to iskomplikovalo query(ako je uopste moguce). Daleko bolji pristup je, kao sto je djoka_l vec predlozio, da se rezultat obradi u PHP-u.
[ dsivic @ 08.06.2012. 18:50 ] @
Tako sam i uradio (na kraju, poslje dužeg lutanja...), ali bi stvaro bilo dobro da se to rijesi jednim upitom, jer i php ima svoja ogranicenja, poput vremensko limita na izvrsavanje skripte...itd
[ bogdan.kecman @ 09.06.2012. 00:23 ] @
izlaz rotiran za 90 stepeni ne mozes nikako da kvalitetno dobijes ni na jednom rdbms-u na svetu i ako ti treba takav result iz baze - pogresan ti je koncept aplikacije.

Neki rdbms-i znaju da su im useri kreteni pa ti takve stvari donekle olaksavaju (oracle db na primer) dok drugi (poput mysql-a) rade na efikasnosti a ako user ne zna kako da napise app, plati support pa ga se nauci .. pomaganje u radu na pogresan nacin samo produbljuje problem

ti uz pomoc css-a (a kapiram da je ovde neki web u pitanju) taj report mozes da formatiras kako ti drago, da ga rotiras za 90 stepeni ili ne bez ikakvih problema te sa normalnim mysql upitom i malo znanja php-a, html-a i css-a mozes da resis problem da uzima ukupno mnogo manje resursa nego da bilo kojim trikovima teras mysql da ti formatira izlaz sa nepoznatim brojem kolona ..
[ dsivic @ 09.06.2012. 06:35 ] @
Ljudi fala na odgovorima,...