powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / значения в столбце в названиях колонок
6 сообщений из 6, страница 1 из 1
значения в столбце в названиях колонок
    #35883858
iva.pet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Друзья, помогите, пожалуйста.

Хочу написать запрос, делающий следующее:
- есть таблица, например:
название цвет
стол синий
стол синий
стол желтый
стол красный
стул синий
стул красный
диван желтый

- нужно написать запрос, который будет считать кол-во разнообразных цветов столов, стульев и т.д и выводить данные в следующем формате
название синий желтый красный
стол 2 1 1
стул 1 1 0
диван 0 1 0

Заранее спасибо за помощь!!!
-
...
Рейтинг: 0 / 0
значения в столбце в названиях колонок
    #35884787
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
with t("название", "цвет") as (values
  ('стол', 'синий')
, ('стол', 'синий')
, ('стол', 'желтый')
, ('стол', 'красный')
, ('стул', 'синий')
, ('стул', 'красный')
, ('диван', 'желтый')
)
select 
  "название"
, sum(case "цвет" when 'синий' then  1  else  0  end) as "синий"
, sum(case "цвет" when 'желтый' then  1  else  0  end) as "желтый"
, sum(case "цвет" when 'красный' then  1  else  0  end) as "красный"
from t
group by "название"
...
Рейтинг: 0 / 0
значения в столбце в названиях колонок
    #35884856
iva.pet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Марк, большое спасибо за запрос!

Единственное, что бы хотелось понять: есть ли возможность обойтись без перечисления всех столбцов вручную?
Если там кроме стол, стул, диван будет еще пара сотен наименований, то запрос будет бесконечным...
Или это возможно только через создание дополнительных таблиц.

Заранее спасибо!
...
Рейтинг: 0 / 0
значения в столбце в названиях колонок
    #35884884
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iva.petЕдинственное, что бы хотелось понять: есть ли возможность обойтись без перечисления всех столбцов вручную?
Если там кроме стол, стул, диван будет еще пара сотен наименований, то запрос будет бесконечным...
Или это возможно только через создание дополнительных таблиц.Вам приётся в этом случае конструировать запрос динамически в 2 этапа: сначала выбрать все различные значения в "цвет" (пусть их будет N штук), а потом сформировать соотв. запрос c N+1 полем.
...
Рейтинг: 0 / 0
значения в столбце в названиях колонок
    #35884895
iva.pet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
это можно сделать только через дополнительную таблицу?
Или можно обойтись без этого?

Можете написать пример, как это делается динамически??
...
Рейтинг: 0 / 0
значения в столбце в названиях колонок
    #35885287
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iva.petэто можно сделать только через дополнительную таблицу?
Или можно обойтись без этого?

Можете написать пример, как это делается динамически??Как правило выгоднее использовать временную таблицу - тогда запрос (особенно это актуально, когда он достаночно затратный по ресурсам), который отбирает данные надо выполнять 1 раз.
Например, для вашего случая, в предположении, что суммироваться будут значения (не содержащие нигде null) строкового поля, можно написать процедуру:
процедура
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
create procedure pivot_str(
  sel varchar( 4000 )
, grp_cols varchar( 128 )
, fact_col varchar( 128 )
, out rc int
, out msg varchar( 4000 )
, out stmt varchar( 4000 ))
begin
  declare sqlcode int;
  declare dist_val varchar( 128 );
  declare c1 cursor for s1;
  declare c2 cursor with return for s2;

  declare exit handler for sqlexception
  begin
    get diagnostics exception  1  msg = message_text;
    set rc = sqlcode;
  end;
  
  set rc =  0 ;
  set stmt = 'declare global temporary table session.$tmp as ('||sel||') definition only with replace not logged';
  execute immediate stmt;
  set stmt=
    'select distinct '||fact_col||' '
  ||'from new table(insert into session.$tmp '||sel||')';
  prepare s1 from stmt;
  set stmt='select '||grp_cols;
  open c1;
  fetch c1 into dist_val;
  while (sqlcode!= 100 ) do
    set stmt = stmt||', sum(case '||fact_col||' when '''||dist_val||''' then 1 else 0 end) as "'||dist_val||'"';
    fetch c1 into dist_val;
  end while;
  close c1;
  set stmt = stmt||' from session.$tmp group by '||grp_cols;
  prepare s2 from stmt;
  open c2;
end@

call pivot_str('select tabname, typename from syscat.columns where tabschema=''SYSCAT'' and tabname like ''TAB%''', 'tabname', 'typename', ?, ?, ?)@
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / значения в столбце в названиях колонок
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]