| Начало » Использование СУБД » PostgreSQL » Помогите с sql-запросом Переход к форуму:
	| 
		
			| Помогите с sql-запросом [сообщение #956] | Fri, 11 November 2022 10:27  |  
			| 
				
				
					|  Newbee Сообщений: 4
 Зарегистрирован: November 2022
 | Junior Member |  |  |  
	| Всем привет! 
 Давно не брал SQL в руки, но все циклично.
 Есть вот такая табличка
 
 Код для создания и insert'aНа выходе sql-запроса надо получить следующий результат (вывести суммы цветов для каждой фамилии):
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');
 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 Oct 31 15:59:08 GMT+3 2025 
 Общее время, затраченное на создание страницы: 0.01310 секунд |