Начало » Использование СУБД » 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 
		
		
		
 |  
	| 
		
	 | 
 
 
 |   
Переход к форуму:
 
 Текущее время: Tue Nov 04 10:35:52 GMT+3 2025 
 Общее время, затраченное на создание страницы: 0.01237 секунд 
 |