LINUX.ORG.RU

SQL засунуть LOOP в SELECT

 , ,


0

1

Имеется Постргя. Как уменьшить код и генерить строки автоматом?

Проблема следующая.

Получаю уникальные значение val1, val2, val3, ...

SELECT DISTINCT "field_2" FROM "MyTable" ;

Потом ручками фигачу:

SELECT "field_1" as "f1", 
    SUM(CASE "field_2" WHEN 'val1' THEN 1 ELSE 0 END) AS "val1", 
    SUM(CASE "field_2" WHEN 'val2' THEN 1 ELSE 0 END) AS "val2",
    # ... можно ли в цикле сгенерить строки с val3, val4 ...
    COUNT(1) AS "summa"
FROM "MyTable" 
GROUP BY "f1";

Как бы в рамках SQL (без высокоуровневых pivot или crosstab) упростить последнеее выражение, заставив Постгрю генерить SUM(...) самостоятельно в цикле?

кажется, вам надо вот это:

SELECT uniq.field_2 AS value, count(*) AS frequency
FROM (SELECT DISTINCT field_2 from mytable) as uniq 
INNER JOIN mytable ON mytable.field_2 = uniq.field_2 
GROUP BY uniq.field_2;
LeninGad
()

Я может чё-то непонял, но разве

SELECT field_1, field_2, COUNT(field_2) FROM... GROUP BY field_1, field_2

не сделает то что ты хочешь?

no-such-file ★★★★★
()

можно ли в цикле сгенерить строки с

Нет.

Как бы заставить Постгрю генерить

Никак. Генерируй sql руками на бекенде, если без этого не можешь и отстань от постгри. Только помни, что метапрораммирование на sql то еще занятие, ввиду слетающих планов и тормозящих запросов, так что лучше вообще обойтись без этого. Юзай простые запросы, без радномных портянок и будет тебе счастье. РСУБД - это не швейцарский нож, которым надо делать вообще всё, как бы тебе там не говорили.

crutch_master ★★★★★
()

задача не реляционная, но можно через json или массивы извернуться:

with
data(f1, f2) as (values
	('f11', 'val2'),
	('f11', 'val3'),
	('f11', 'val1'),
	('f12', 'val1'),
	('f12', 'val3'),
	('f12', 'val2'),
	('f13', 'val1'),
	('f13', 'val3'),
	('f13', 'val2'),
	('f13', 'val1'),
	('f13', 'val3'),
	('f13', 'val2'),
	('f14', 'val2')
)
select f1, json_object_agg(f2, ss), sum(ss) ss from (
	select d.f1, d.f2, count(*) ss
	from data d
	group by d.f1, d.f2
) _
group by f1
drsm ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.