SQLRU.net
Разработка приложений баз данных

Начало » Использование СУБД » PostgreSQL » Помогите с sql-запросом
Помогите с sql-запросом [сообщение #956] Fri, 11 November 2022 10:27 Переход к следующему сообщению
Newbee в настоящее время не в онлайне  Newbee
Сообщений: 4
Зарегистрирован: November 2022
Junior Member
Всем привет!

Давно не брал SQL в руки, но все циклично.
Есть вот такая табличка
Код для создания и insert'a
На выходе sql-запроса надо получить следующий результат (вывести суммы цветов для каждой фамилии):
Name/Color|RED|YELLOW|GREEN|PURPLE
Ivanov | 3 | 1 | 2 | 0
Petrov | 2 | 3 | 1 | 1
Sidorov | 2 | 1 | 2 | 2

Крутил, вертел, но пока не вспомнил как из первой таблички получить вторую.
Re: Помогите с sql-запросом [сообщение #959 является ответом на сообщение #956] Fri, 11 November 2022 13:13 Переход к предыдущему сообщениюПереход к следующему сообщению
BlackEric в настоящее время не в онлайне  BlackEric
Сообщений: 282
Зарегистрирован: June 2022
Senior Member
Select u_name, GREEN, RED, YELLOW, PERFECT
From test_tbl
PIVOT (count(u_color) for u_color in (GREEN, RED, YELLOW, PERFECT)
           ) AS test_pivot
Постгреса под рукой нет. Проверял на ms sql.
Re: Помогите с sql-запросом [сообщение #960 является ответом на сообщение #959] Fri, 11 November 2022 14:03 Переход к предыдущему сообщениюПереход к следующему сообщению
Newbee в настоящее время не в онлайне  Newbee
Сообщений: 4
Зарегистрирован: November 2022
Junior Member
У меня как раз PostgreSQL - ругается на PIVOT.

[Обновления: Fri, 11 November 2022 14:04]

Известить модератора

Re: Помогите с sql-запросом [сообщение #962 является ответом на сообщение #960] Fri, 11 November 2022 15:50 Переход к предыдущему сообщениюПереход к следующему сообщению
BlackEric в настоящее время не в онлайне  BlackEric
Сообщений: 282
Зарегистрирован: June 2022
Senior Member
Можно как-то так:

SELECT u_name,
count(u_color) FILTER (WHERE u_color= "GREEN") AS "GREEN",
count(u_color) FILTER (WHERE u_color= "RED") AS "RED",
count(u_color) FILTER (WHERE u_color= "YELLOW") AS "YELLOW",
count(u_color) FILTER (WHERE u_color= "PERFECT") AS "PERFECT"
FROM test_tbl
GROUP BY u_name;

Не проверял, т.к. не на чем.
Re: Помогите с sql-запросом [сообщение #973 является ответом на сообщение #962] Sun, 13 November 2022 13:50 Переход к предыдущему сообщениюПереход к следующему сообщению
fraks в настоящее время не в онлайне  fraks
Сообщений: 108
Зарегистрирован: June 2022
Географическое положение: Новосибирск
Senior Member
http://sql2.ru/viewtopic.php?t=79&sid=28f6ea99c39e8c3b74 230a6d7ec6d19d

select
  u_name,
  --
  sum ( case when u_color = 'RED'     then 1 else 0 end ) as RED,
  sum ( case when u_color = 'YELLOW'  then 1 else 0 end ) as YELLOW,
  sum ( case when u_color = 'GREEN'   then 1 else 0 end ) as GREEN,
  sum ( case when u_color = 'PERFECT' then 1 else 0 end ) as PERFECT,
  sum ( case when u_color = 'PURPLE'  then 1 else 0 end ) as PURPLE

from
  test_tbl

group by
  u_name
;  

+=========+=====+========+=======+=========+========+
| u_name  | red | yellow | green | perfect | purple |
+=========+=====+========+=======+=========+========+
| Petrov  | 2   | 3      | 1     | 1       | 0      |
| Sidorov | 2   | 1      | 2     | 2       | 0      |
| Ivanov  | 3   | 1      | 2     | 0       | 0      |
+---------+-----+--------+-------+---------+--------+
Re: Помогите с sql-запросом [сообщение #977 является ответом на сообщение #962] Mon, 14 November 2022 10:05 Переход к предыдущему сообщениюПереход к следующему сообщению
Newbee в настоящее время не в онлайне  Newbee
Сообщений: 4
Зарегистрирован: November 2022
Junior Member
Спасибо! Этот запрос наботает!
Re: Помогите с sql-запросом [сообщение #1588 является ответом на сообщение #977] Fri, 10 February 2023 16:53 Переход к предыдущему сообщению
Aleksey291179 в настоящее время не в онлайне  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
Предыдущая тема: PostgreSQL 15 изнутри
Следующая тема: Расстояние между географическими координатами
Переход к форуму:
  


Текущее время: Thu Mar 28 11:51:42 GMT+3 2024

Общее время, затраченное на создание страницы: 0.01240 секунд