Начало » Использование СУБД » PostgreSQL » Помогите с sql-запросом
Помогите с sql-запросом [сообщение #956] |
Fri, 11 November 2022 10:27 |
Newbee
Сообщений: 4 Зарегистрирован: November 2022
|
Junior Member |
|
|
Всем привет!
Давно не брал SQL в руки, но все циклично.
Есть вот такая табличка
Код для создания и insert'a
CREATE TABLE test_tbl (
u_name varchar NOT NULL,
u_color varchar NULL
);
INSERT INTO test_tbl (u_name, u_color) values ('Ivanov', 'RED');
INSERT INTO test_tbl (u_name, u_color) values ('Petrov', 'YELLOW');
INSERT INTO test_tbl (u_name, u_color) values ('Ivanov', 'RED');
INSERT INTO test_tbl (u_name, u_color) values ('Petrov', 'YELLOW');
INSERT INTO test_tbl (u_name, u_color) values ('Ivanov', 'GREEN');
INSERT INTO test_tbl (u_name, u_color) values ('Petrov', 'PERFECT');
INSERT INTO test_tbl (u_name, u_color) values ('Petrov', 'RED');
INSERT INTO test_tbl (u_name, u_color) values ('Sidorov', 'GREEN');
INSERT INTO test_tbl (u_name, u_color) values ('Sidorov', 'GREEN');
INSERT INTO test_tbl (u_name, u_color) values ('Sidorov', 'YELLOW');
INSERT INTO test_tbl (u_name, u_color) values ('Ivanov', 'RED');
INSERT INTO test_tbl (u_name, u_color) values ('Sidorov', 'PERFECT');
INSERT INTO test_tbl (u_name, u_color) values ('Sidorov', 'PERFECT');
INSERT INTO test_tbl (u_name, u_color) values ('Petrov', 'YELLOW');
INSERT INTO test_tbl (u_name, u_color) values ('Ivanov', 'GREEN');
INSERT INTO test_tbl (u_name, u_color) values ('Sidorov', 'RED');
INSERT INTO test_tbl (u_name, u_color) values ('Petrov', 'RED');
INSERT INTO test_tbl (u_name, u_color) values ('Petrov', 'GREEN');
INSERT INTO test_tbl (u_name, u_color) values ('Ivanov', 'YELLOW');
INSERT INTO test_tbl (u_name, u_color) values ('Sidorov', 'RED');
На выходе sql-запроса надо получить следующий результат (вывести суммы цветов для каждой фамилии):
Name/Color|RED|YELLOW|GREEN|PURPLE
Ivanov | 3 | 1 | 2 | 0
Petrov | 2 | 3 | 1 | 1
Sidorov | 2 | 1 | 2 | 2
Крутил, вертел, но пока не вспомнил как из первой таблички получить вторую.
|
|
|
|
|
|
|
|
Re: Помогите с sql-запросом [сообщение #1588 является ответом на сообщение #977] |
Fri, 10 February 2023 16:53 |
Aleksey291179
Сообщений: 1 Зарегистрирован: February 2023
|
Junior Member |
|
|
Добрый день! Прошу помочь.
С помощью расширения pgstattuple есть возможность выводить статистику по таблицам в разрезе подсчёта процента «мёртвых» кортежей. Функция pgstattuple() принимает в качестве аргумента имя таблицы. Возникла идея выводить статистику по всем таблицам с помощью цикла. На одной таблице функция работает:
test=# SELECT * FROM pgstattuple('tabletest');
table_len | tuple_count | tuple_len | tuple_percent | dead_tuple_count | dead_tuple_len | dead_tuple_percent | free_space | free_percent
\-----------+-------------+-----------+---------------+----- -------------+----------------+--------------------+-------- ----+--------------
0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0
(1 row)
Запрос SELECT ('''' || table_name || '''') AS table_name
FROM information_schema.tables
возвращает список таблиц
'tabletest'
'pg_statistic'
'pg_type'
'pg_foreign_table'
но в составе работы цикла на первой итерации выходит ошибка relation "'tabletest'" does not exist
test=# do $$
test$# declare
test$# f varchar;
test$# begin
test$# for f in
test$#
test$# SELECT ('''' || table_name || '''') AS table_name
test$# FROM information_schema.tables
test$# loop
test$# SELECT * FROM pgstattuple(f);
test$# end loop;
test$# end; $$;
ERROR: relation "'tabletest'" does not exist
CONTEXT: SQL statement "SELECT * FROM pgstattuple(f)"
PL/pgSQL function inline_code_block line 10 at SQL statement
при этом если просто выводить имена таблиц в цикле, то всё работает
test=# do $$
test$# declare
test$# f varchar;
test$# begin
test$# for f in
test$#
test$# SELECT ('''' || table_name || '''') AS table_name
test$# FROM information_schema.tables
test$# loop
test$# raise notice '%', f;
test$# end loop;
test$# end; $$;
NOTICE: 'tabletest'
NOTICE: 'pg_statistic'
NOTICE: 'pg_type'
NOTICE: 'pg_foreign_table
|
|
|
Переход к форуму:
Текущее время: Fri Nov 15 07:50:56 GMT+3 2024
Общее время, затраченное на создание страницы: 0.01240 секунд
|