DevProTalk

DevProTalk (http://www.devprotalk.com/index.php)
-   SQL baze podataka - Sponzor: Baze-Podataka.net (http://www.devprotalk.com/forumdisplay.php?f=10)
-   -   Sumiranje parova (http://www.devprotalk.com/showthread.php?t=10344)

razno 04. 09. 2011. 20:18

Sumiranje parova
 
Pozdrav,

imam jedan problem na kome sam zakucao.
Najme imam tabelu Skup_proizvoda(ID1,ID2,broj)
ID1 i ID2 referenciraju tabelu proizvodi. Ono sto treba da uradim je da izbacim sumu brojeva za svaki par. Par se moze pojavljivati vise puta. Takodje pod jednim parom se podrazumeva 1|2 i 2|1
Evo primer podatak
ID1|ID2|broj
------------
1|2|10
2|1|20
1|3|5
Ocekivani rezultat treba da bude
ID1|ID2|BROJ
-------------
1|2|30
1|3|5

Resenje treba da bude cist SQL

webarto 04. 09. 2011. 22:04

PHP kôd:

SELECT t2.id_1t2.id_2SUM(t1.brojbroj
FROM dpt t1
LEFT JOIN dpt t2 ON t1
.id_1 t2.id_2
WHERE t1
.id_2 t2.id_1 

id_1 id_2 broj
1 2 30

E sad jedino još da selektuje ove single parove...

jablan 04. 09. 2011. 22:21

Ja bih rađe to uradio sa ugnježđenim upitom da dovedem ID1 i ID2 u red, pa onda nad time običan GROUP BY.

Znači nešto na foru
Kôd:

SELECT id1, id2, sum(broj) FROM
(
  SELECT
  CASE WHEN id1 > id2 THEN id2 ELSE id1 AS id1,
  CASE WHEN id1 > id2 THEN id1 ELSE id2 AS id2,
  broj
  FROM dpt
) a
GROUP BY id1, id2


razno 05. 09. 2011. 00:51

@webarto Ne ispisuje sve redove, tj ispisuje one koji se javljaju u obe varijante dok oni koji su u jednoj ne ispisuje. Hvala u svakom slucaju na odgovoru

@Jablan da to je to resenje.

Sad vidim kako je prosto, ali kad ti nije dan, nije ti :)

webarto 05. 09. 2011. 19:56

Da, napisao sam to :) @jablan, znaš li ti možda da prepraviš ovaj moj query, a da vraća oba rezultata, ili ovaj suprotni :) Hvala.

jablan 06. 09. 2011. 07:31

Teško bogami. Mislim da nije dobar put. Imaš banalan primer, npr da imaš u tabeli

Kôd:

1 2 10
1 2 10
2 1 10
2 1 10

u JOINU ćeš onda imati 8 redova kao rezultat, tj suma će ti biti 80, a ne 40, zar ne?

ivanhoe 06. 09. 2011. 08:37

evo ovako:
Kôd:

SELECT t1.id1, t1.id2, IF(t2.id1, (t1.broj + t2.broj), t1.broj) AS broj
FROM proba t1
LEFT JOIN proba t2 ON (t1.id1 = t2.id2 AND t1.id2 = t2.id1)


razno 06. 09. 2011. 10:24

@ivanhoe Nece bas raditi kako treba. Radi sumiranje lepo, medjutim ne izbacuje duplikate iz rezultata (sto treba).
I ja sam krenuo da resavam sa join-om medjutim zakucao sam na tom delu izbacivanja duplih rezultata :)

jablan 06. 09. 2011. 10:29

Citat:

Originalno napisao ivanhoe (Napišite 101417)
evo ovako:

Nisam siguran da razumem ideju:

Kôd:

test=# create table dpt (id1 integer, id2 integer, broj integer);
CREATE TABLE
test=# insert into dpt values (1, 2, 10);
INSERT 0 1
test=# insert into dpt values (1, 2, 10);
INSERT 0 1
test=# insert into dpt values (2, 1, 10);
INSERT 0 1
test=# insert into dpt values (2, 1, 10);
INSERT 0 1
test=# insert into dpt values (1, 3, 10);
INSERT 0 1
test=# SELECT t1.id1, t1.id2, t1.broj + coalesce(t2.broj, 0) AS broj
FROM dpt t1
LEFT JOIN dpt t2 ON (t1.id1 = t2.id2 AND t1.id2 = t2.id1);
 id1 | id2 | broj
-----+-----+------
  1 |  2 |  20
  1 |  2 |  20
  1 |  2 |  20
  1 |  2 |  20
  1 |  3 |  10
  2 |  1 |  20
  2 |  1 |  20
  2 |  1 |  20
  2 |  1 |  20
(9 rows)


ivanhoe 06. 09. 2011. 14:58

da, da, nisam pazljivo procitao opis, ne resava se duplikata... mada mora da ima neka fora i ovako, trebalo bi da (skoro) svaki subquery moze da se resi i JOIN-om

EDIT: Evo ovo radi:
Kôd:

SELECT t1.`id1`, t1.id2, t1.broj + coalesce(t2.broj, 0) AS broj
FROM proba t1
LEFT JOIN proba t2 ON (t1.id1 = t2.id2 AND t1.id2 = t2.id1)
GROUP BY IF(t1.id1<t1.id2, t1.id1, t1.id2), IF(t1.id1 > t1.id2, t1.id1, t1.id2)



Vreme je GMT +2. Trenutno vreme je 07:47.

Powered by vBulletin® Verzija 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Copyright © DevProTalk. All Rights Reserved.

Mišljenja, saveti, izjave, ponude ili druge informacije ili sadržaji nastali na Sajtu su vlasništvo onoga ko ih je kreirao, a ne DevProTalk.com, tako da ne morate da se oslanjate na njih.
Autori poruka su jedini odgovorni za ovakve sadržaje. DevProTalk.com ne garantuje tačnost, kompletnost ili upotrebnu vrednost informacija, stavova, saveta ili datih izjava. Ne postoje uslovi pod kojima bi mi bili odgovorni za štetu ili gubitak koji je posledica bilo čijeg oslanjanja na nepouzdane informacije, ili bilo kakve informacije nastale kroz komunikaciju između registrovanih članova.
Web sajt može sadržavati linkove na druge web sajtove na Internetu ili neke druge sadržaje. Ne kontrolišemo niti podržavamo te druge web sajtove, niti smo pregledali bilo kakve sadržaje na takvim sajtovima. Mi nećemo biti odgovorni za legalnost, tačnost ili prikladnost bilo kog sadržaja, oglasa, proizvoda, usluga ili informacije lociranim na ili distribuiranih kroz druge web sajtove, niti za bilo kakvu štetu nastalu kao posledica takvih informacija. DevProTalk.com drži i čuva druga prava vlasništva na web sajtu. Web sajt sadrže materijale zaštićene copyright-om, zaštitne znakove i druge informacije o pravu vlasništva ili softver. Članovi mogu poslatu informacije zaštićene pravima vlasništva njihovih nosilaca i ona ostaju zaštićena bez obzira da li su oni koji prenose te informacije to naveli ili ne. Osim informacija koje su u javnom vlasništvu ili za koje dobijete dozvolu, nemate pravo da kopirate, modifikujete ili na bilo koji način menjate, objavljujete, prenosite, distribuirate, izvršavate, prikazujete ili prodajte bilo koju informaciju zaštićenu pravima vlasništva. Slanjem informacija ili sadržaja na bilo koji deo DevProTalk.com, Vi automatski dozvoljavate i predstavljate garanciju da imate pravo da dozvolite DevProTalk.com ili članovima DevProTalk.com bespovratnu, kontinualnu, neograničenu, globalnu dozvolu da koriste, kopiraju, izvršavaju, prikazuju i distribuiraju takve informacije i sadržaje i da iz takvih sadžaja koriste bilo koji deo u bilo koje svrhe, kao i pravo i dozvolu da koriste gore navedene sadržaje. Svi zaštitni znakovi (trademarks), logotipi, oznake usluga, firme ili imena proizvoda koji se pominju na ovom web sajtu su vlasništvo kojim raspolažu njihovi vlasnici.