<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>
		<title><![CDATA[Forum PostgreSQL - Mnożenie wartości z dwóch tabel]]></title>
		<link>https://forum.postgresql.org.pl/viewtopic.php?id=1399</link>
		<description><![CDATA[Najświeższe odpowiedzi w Mnożenie wartości z dwóch tabel.]]></description>
		<lastBuildDate>Sun, 07 Oct 2012 20:45:17 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Odp: Mnożenie wartości z dwóch tabel]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=3746#p3746</link>
			<description><![CDATA[Dzieki za odpowiedz z checia ta sprawdze. Aczkolwiek wymogiem bylo uzycie triggera. Ale juz sobie poradzilem]]></description>
			<author><![CDATA[dummy@example.com (zajac)]]></author>
			<pubDate>Sun, 07 Oct 2012 20:45:17 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=3746#p3746</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Mnożenie wartości z dwóch tabel]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=3745#p3745</link>
			<description><![CDATA[Zanim zaczniesz stosować trigerry warto wykorzystać opcję CHECK dla pola np.
ALTER TABLE nazwa_tabeli ADD CONSTRAINT tabela_test_pola CHECK (nazwa_pola<>0);]]></description>
			<author><![CDATA[dummy@example.com (c_michal)]]></author>
			<pubDate>Sun, 07 Oct 2012 20:39:29 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=3745#p3745</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Mnożenie wartości z dwóch tabel]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=3744#p3744</link>
			<description><![CDATA[Dziękuje bardzo za pomoc. Z drugiej strony moze ktos mi powie jak zrobic trigger ktory uniemoziwia wstawienie rekordu mniejszego badz rownego 0?]]></description>
			<author><![CDATA[dummy@example.com (zajac)]]></author>
			<pubDate>Sat, 06 Oct 2012 08:46:56 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=3744#p3744</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Mnożenie wartości z dwóch tabel]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=3738#p3738</link>
			<description><![CDATA[to nie takie proste zagadnienie jak by się wydawało ale proszę poniżej masz dwie metody obliczenia tej daty w zależności jaką wersje postgresa dysponujesz. Ponieważ nie załączasz struktury bazy sam sobie ją musiałem stworzyć.
(na przyszłość proszę podawaj podstawowe dane)


create table medium (id serial primary key, nazwa varchar(100));
insert into medium (nazwa) values('woda'),('gaz');
create table taryfa (id serial primary key, medium_id integer not null,data_od date not null,data_do date not null,wartosc real not null);
insert into taryfa (medium_id,data_od,data_do,wartosc) values 
((select id from medium where nazwa='woda'),'2012-01-01'::date,'2012-01-31'::date,1.0)
,((select id from medium where nazwa='woda'),'2012-02-01'::date,'infinity'::date,2.0)
,((select id from medium where nazwa='gaz'),'2012-01-01'::date,'2012-03-31'::date,5.0)
,((select id from medium where nazwa='gaz'),'2012-04-01'::date,'infinity'::date,6.0);
create table zuzycie (id serial primary key, data timestamp not null , wartosc real not null ,medium_id integer not null);
insert into zuzycie (data,wartosc,medium_id) values
('2012-01-01'::date,1,(select id from medium where nazwa='woda'))
,('2012-02-04'::date,4,(select id from medium where nazwa='woda'))
,('2012-03-08'::date,14,(select id from medium where nazwa='woda'))
,('2012-04-01'::date,20,(select id from medium where nazwa='woda'))
,('2012-01-01'::date,1,(select id from medium where nazwa='gaz'))
,('2012-08-01'::date,1,(select id from medium where nazwa='gaz'));

a tu masz sam finalny select

select z.data
,z.wartosc as zuzycie
,t.wartosc as taryfa
,z.wartosc * t.wartosc as koszt
,lag(z.data,1,null) over(partition by z.medium_id order by z.data) as poprzedni_odczyt_metoda_1
,(select data from zuzycie as s where s.medium_id=z.medium_id  and s.data < z. data order by s.data desc limit 1) as poprzedni_odczyt_metoda_2
,z.data-lag(z.data,1,null) over(partition by z.medium_id order by z.data) as uplynelo
from zuzycie z
left join taryfa t on z.medium_id=t.medium_id and z.data between t.data_od and t.data_do
where z.medium_id = (select id from medium where nazwa = 'woda')
order by z.data; 

Musisz sobie zdawać sprawę, że trzeba jeszcze  oprogramować takie sytuacje jak:
- zużycie (odczyt licznika) nastąpiło gdy kończyła się jedna taryfa, a zaczynała obowiązywać kolejna
- zakres dat w polach data_od i data_do w tabeli taryfa nie mogą się nakładać i powinny być ciągłe (bez przerw)]]></description>
			<author><![CDATA[dummy@example.com (c_michal)]]></author>
			<pubDate>Mon, 01 Oct 2012 20:32:03 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=3738#p3738</guid>
		</item>
		<item>
			<title><![CDATA[Mnożenie wartości z dwóch tabel]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=3732#p3732</link>
			<description><![CDATA[Witam,
czy mógłby mi ktoś pomóc ponieważ dopiero zaczynam naukę. Chodzi o to że w jednej tabeli mamy 'zuzyta_woda" oraz 'zuzyty_prad' zas w drugiej tabeli mamy 'woda', 'prad'. Chciałbym przemnożyć zuzyta_woda * woda i analogicznie prąd. Oraz drugi problem, żeby policzyło mi ile dni upłyneło od jednej daty do drugiej, np od 2012-09-13 do 2012-10-14;

Z góry dziękuje za pomoc.]]></description>
			<author><![CDATA[dummy@example.com (zajac)]]></author>
			<pubDate>Sun, 30 Sep 2012 18:46:13 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=3732#p3732</guid>
		</item>
	</channel>
</rss>
