Zapytanie SQL z agregacją

0

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.

0

Pytanie z innej beczki. Co sie stanie gdy do tabeli "product" dodasz rekord BEZ id_category?

0

Dzięki za zainteresowanie:

Nie mogę dodać produktu, bez kategorii ponieważ na kluczu obcym w tabeli product obowiązuje constraint NOT NULL.

  id_category BIGINT NOT NULL DEFAULT NEXTVAL('category_id_category_seq_1'::regclass),
0

Ok dzięki. Naprawiłem tą usterkę przez:

ALTER TABLE product ALTER COLUMN id_category DROP DEFAULT;

Obecnie tabela produkt wygląda tak:

CREATE TABLE product
(
  product_id bigserial NOT NULL,
  id_category bigint NOT NULL,
  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;

1 użytkowników online, w tym zalogowanych: 0, gości: 1