<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>
		<title><![CDATA[Forum PostgreSQL - sum(pole) dla 22 różnych id]]></title>
		<link>https://forum.postgresql.org.pl/viewtopic.php?id=1175</link>
		<description><![CDATA[Najświeższe odpowiedzi w sum(pole) dla 22 różnych id.]]></description>
		<lastBuildDate>Mon, 05 Mar 2012 07:50:24 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Odp: sum(pole) dla 22 różnych id]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=3489#p3489</link>
			<description><![CDATA[Odnawiam temat gdyż potrzebuję (nie mogę sobie poradzić) bardziej skomplikowany wynik:

w tabeli tab1 dokładamy pole warunek (zakres wartości od 1-7)
[code]
drop table tab1;
Create Table tab1 (
    id integer Primary Key,
    pole integer,
    id_tab2 integer References tab2,
    warunek integer
);

Insert Into tab1
    Select -- ew. można załatwić to jednym rand'em
        id, trunc(random()*100 + 1),
        trunc(random()*22 + 1),
        trunc(random()*7 + 1)
    From generate_series(1, 22*3) id;
[/code]

Potrzebuję pobrać dane w postaci (odpowiedź gszpetkowski)

[code]
Select
    id_tab2, sum(pole),
    (Select nazwa From tab2 Where id = id_tab2) As nazwa
From tab1
Where id_tab2 Between 1 And 22
Group By id_tab2
Order By id_tab2;
[/code]

tak aby wynik był w postaci

Przykładowy wynik:
 id_tab2 | sum | nazwa | warunek2|warunek3|warunek4|warunek5|warunek6|warunek7
---------+-----+-------+-----+-----+-----+-----+-----+-----+
       1 | 151 | aaaa| 0 | 2 | 0 | 7 | 0 | 0
       2 |  57 | bbbb | 3 | 0 | 0 | 0 | 0 | 8

czyli sum jest sumą bez względu na warunek natomiast osobno potrzebuję zliczyć sumy dla warunku=2 lub warunku=3 aż do warunku=7]]></description>
			<author><![CDATA[dummy@example.com (przesq)]]></author>
			<pubDate>Mon, 05 Mar 2012 07:50:24 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=3489#p3489</guid>
		</item>
		<item>
			<title><![CDATA[Odp: sum(pole) dla 22 różnych id]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=3299#p3299</link>
			<description><![CDATA[Ok, czyli rozumiem, że tab1 przechowuje wiele pól o tych samych id_tab2, a z kolei jego własne id (klucz główny) leci sobie sekwencyjnie od jedynki. W moim rozwiązaniu zmieniłem DDL do postaci:

[code]Create Table tab2 (
    id integer Primary Key,
    nazwa text
);
Create Table tab1 (
    id integer Primary Key,
    pole integer,
    id_tab2 integer References tab2
);[/code]

Dla tab2 wprowadzanie danych jest raczej proste (i oczywiście nazwa będzie unikalna dla 22 wierszy):

[code]Insert Into tab2
    Select id, repeat(chr(96 + id), 4) From generate_series(1, 22) id;[/code]

W przypadku tab1 losuje po 3 serie wartości 1-100 dla puli id_tab 1-22:

[code]Insert Into tab1
    Select -- ew. można załatwić to jednym rand'em
        id, trunc(random()*100 + 1),
        trunc(random()*22 + 1)
    From generate_series(1, 22*3) id;[/code]

Co ciekawe przy takim losowaniu nie zawsze wszystkie id_tab2 będą wstawione (może np. zabraknąć 3 i 19), dlatego przygotowałem obydwa warianty rozwiązań (oczywiście można przyjąć, że zawsze tam będą, ale wolałem ten przypadek także ująć):

[code]Select
    id_tab2, sum(pole),
    (Select nazwa From tab2 Where id = id_tab2) As nazwa
From tab1
Where id_tab2 Between 1 And 22
Group By id_tab2
Order By id_tab2;

Przykładowy wynik:
 id_tab2 | sum | nazwa 
---------+-----+-------
       1 | 151 | aaaa
       2 |  57 | bbbb
       4 | 264 | dddd
       5 | 122 | eeee
       6 | 247 | ffff
       7 | 240 | gggg
       8 | 397 | hhhh
       9 | 123 | iiii
      10 | 318 | jjjj
      11 | 353 | kkkk
      12 |  38 | llll
      13 |  80 | mmmm
      14 | 112 | nnnn
      15 |  47 | oooo
      16 | 213 | pppp
      17 | 283 | qqqq
      18 |  72 | rrrr
      20 |  75 | tttt
      21 | 126 | uuuu
      22 |  92 | vvvv
(20 rows)[/code]

Drugi wariant (wstaw sumę 0 jeżeli w tabeli tab1 nie znajduje się pełny zakres [b]id_tab2[/b] od 1 do 22):

[code]Select
    id_gn As id,
    Coalesce(sum(pole), 0) As suma,
    (Select nazwa From tab2 Where id = id_gn) As nazwa
From tab1
    Right Join generate_series(1, 22) id_gn On id_gn = id_tab2
Group By id_gn
Order By id_gn;

Przykładowy wynik (ten same dane co wyżej):
 id | suma | nazwa 
----+------+-------
  1 |  151 | aaaa
  2 |   57 | bbbb
  3 |    0 | cccc
  4 |  264 | dddd
  5 |  122 | eeee
  6 |  247 | ffff
  7 |  240 | gggg
  8 |  397 | hhhh
  9 |  123 | iiii
 10 |  318 | jjjj
 11 |  353 | kkkk
 12 |   38 | llll
 13 |   80 | mmmm
 14 |  112 | nnnn
 15 |   47 | oooo
 16 |  213 | pppp
 17 |  283 | qqqq
 18 |   72 | rrrr
 19 |    0 | ssss
 20 |   75 | tttt
 21 |  126 | uuuu
 22 |   92 | vvvv
(22 rows)[/code]

Mam nadzieję, że to wyczerpuje Twoje zagadnienie.
Pozdrawiam]]></description>
			<author><![CDATA[dummy@example.com (gszpetkowski)]]></author>
			<pubDate>Tue, 22 Nov 2011 22:00:29 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=3299#p3299</guid>
		</item>
		<item>
			<title><![CDATA[Odp: sum(pole) dla 22 różnych id]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=3298#p3298</link>
			<description><![CDATA[w wyniku otrzymałem tylko jedną odpowiedź:

1189 jakas wartosc

a tymczasem ja chcę otrzymać:

suma_id1 ; suma_id2 ; .... ; suma_id22

8; 14;....;33

przy czym suma_id1 - dla id_tab2=1, suma_id2 - dla id_tab2=2 i tak do 22

jakas_nazwa jest niepowtarzalna stąd 22 różne id.

w warunku należy dołożyć dodatkowe id_gat_drzewa znajdujące się w tab1 i dla tego konkretnego id_gat_drzewa chciałbym obliczyć sumy wartości dla różnych kategorii ponieważ nie dla każdego id_tab2 ta suma będzie większa od 0 to ograniczę sobie wyniki oraz dalsze już w ramach tej sumy > 0 zapytanie.

czy można to zrobić 1 zapytaniem czy sprawdzać po kolei od 1 do 22?]]></description>
			<author><![CDATA[dummy@example.com (przesq)]]></author>
			<pubDate>Tue, 22 Nov 2011 20:10:27 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=3298#p3298</guid>
		</item>
		<item>
			<title><![CDATA[Odp: sum(pole) dla 22 różnych id]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=3294#p3294</link>
			<description><![CDATA[Może coś takiego:

[code]Select
    sum(pole),
    (Select jakas_nazwa From tab2 Limit 1) AS jakas_nazwa
From tab1
Where id_tab2 Between 1 And 22[/code]

Nie bardzo widzę jak to jest przechowywane, czy np. w tab2 znajdują się 22 wiersze (od 1 do 22) i TA sama wartość jakas_nazwa dla każdego z nich. Na własne potrzeby z tego co zrozumiałem z treści wynika taki DDL+DML:

[code]Create Table tab2 (
    id_tab2 integer Primary Key,
    jakas_nazwa text
);
Create Table tab1 (
    id_tab1 integer Primary Key,
    pole integer,
    id_tab2 integer References tab2(id_tab2)
);
Insert into tab2 select id, 'jakas wartosc' from generate_series(1, 22) id;
Insert into tab1 select id,  trunc(random()*100 + 1), id from generate_series(1, 22) id;[/code]]]></description>
			<author><![CDATA[dummy@example.com (gszpetkowski)]]></author>
			<pubDate>Mon, 21 Nov 2011 17:53:37 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=3294#p3294</guid>
		</item>
		<item>
			<title><![CDATA[sum(pole) dla 22 różnych id]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=3293#p3293</link>
			<description><![CDATA[Witam,

mam 2 tabele

----tab1
id_tab1
pole
id_tab2 - z tab2

oraz
---tab2
id_tab2
jakas_nazwa

mam id_tab2 od 1-22 i potrzebuję obliczyć sum(pole) z tab1 biorąc pod uwagę, że id_tab2=1 i id_tab2=2 ... aż do id_tab2=22

1. czy można to zrobić jednym zapytaniem czy trzeba aż 22 zapytania?
2. czy można by było po wykonaniu p1 dołączyć do wyniku sum nazwę pola z tab2 pt jakas_nazwa - podejrzewam, że tutaj bez crosstab się nie obejdzie.

pozdrawiam.]]></description>
			<author><![CDATA[dummy@example.com (przesq)]]></author>
			<pubDate>Mon, 21 Nov 2011 12:13:12 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=3293#p3293</guid>
		</item>
	</channel>
</rss>
