Witam,
Pracuje na PostgreSQL 9.3. Stworzyłem następującą prostą baze danych na potrzeby nauki SQL:
CREATE TABLE category
(
id_category bigserial NOT NULL,
name character varying(40) NOT NULL,
CONSTRAINT id_category PRIMARY KEY (id_category)
)
WITH (
OIDS=FALSE
);
ALTER TABLE category
OWNER TO postgres;
CREATE TABLE product
(
product_id bigserial NOT NULL,
id_category bigint NOT NULL DEFAULT nextval('category_id_category_seq_1'::regclass),
name character varying(40) NOT NULL,
price numeric NOT NULL,
CONSTRAINT product_id PRIMARY KEY (product_id),
CONSTRAINT category_product_fk FOREIGN KEY (id_category)
REFERENCES category (id_category) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
OIDS=FALSE
);
ALTER TABLE product
OWNER TO postgres;
Mam następujące zapytanie w języku SQL, które:
a) podaje ile jest produktów w kategorii
b) minimalna, średnią i maksymalną cenę w danej kategorii
SELECT
c.name,
COUNT(p.product_id) AS ilosc_w_kategorii,
MIN (p.price) AS min_cena,
AVG (p.price) AS avg_cena,
MAX (p.price) AS max_cena
FROM product p
INNER JOIN category c ON c.id_category = p.id_category
GROUP BY
c.id_category;
Zależy mi na takim rozbudowaniu zapytania, aby dodatkowo wyświetlić:
nazwa kategorii, ilosc produktów,
minimalna cena, nazwa produktu z minimalną ceną.
Udało mi się napisać zapytanie SQL, które wyświetla produkty w danej kategorii z minimalną cena (może być więcej niż 1 produkt z minimalna ceną i wtedy mają się np. wyświetlić wszystkie produkty w danej kategorii, które mają minimalna cenę):
SELECT
c.name AS kategoria,
p.name AS produkt_najtanszy,
p.price AS cena
FROM product p
INNER JOIN category c ON c.id_category = p.id_category
WHERE
p.price IN (
SELECT MIN(pp.price) FROM product pp WHERE pp.id_category = p.id_category
) ORDER BY c.name ASC, p.price DESC;
Zastanawia mnie jednak w jaki sposób połączyć to w jedno zapytanie SQL.
Pozdrawiam i dziękuję za wszystkie wskazówki.