powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Запрос с неизвестным числом колонок
9 сообщений из 9, страница 1 из 1
Запрос с неизвестным числом колонок
    #34518143
DB2Adventurer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица районов REGION(ID,NAME), таблица CUSTOMERS(ID, DISTRICT_ID, REG_DATE).
На этапе выполнения пользователь выбирает год по который нужно вывести распределение количества клиентов в каждом районе по годам регистрации.

DISTRICT/Year 2002 2003 2004
1 5 3 5
2 7 3 6
3 9 4 6

Можно запихать районы в качестве колонок, но их много и расписывать лень, к тому же отчет не смотрится. Какой подход вообще используется для решения таких задач? Посоветуйте пожалуйста.
...
Рейтинг: 0 / 0
Запрос с неизвестным числом колонок
    #34518158
DB2Adventurer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
МОжет у кого-то есть пример процедуры?
...
Рейтинг: 0 / 0
Запрос с неизвестным числом колонок
    #34519294
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. вы хотите получить crosstable?
...
Рейтинг: 0 / 0
Запрос с неизвестным числом колонок
    #34519304
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Варианты:
1)Заюзать XML
2)Заюзать временные таблицы.
...
Рейтинг: 0 / 0
Запрос с неизвестным числом колонок
    #34522153
DB2Adventurer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gardenman Т.е. вы хотите получить crosstable?
Да, кажется, это так называется, если не ошибаюсь. Я решил использовать временные таблицы, причем следующим образом: делать обычный запрос с фиксированным числом колонок по районам, затем делать транспонирование(т.е. перевести колонки в строки, а строки наоборот в колонки). Строк в первичном запросе будет меньше чем 255. Думаю это более-менее универсальное решение, не зависит от задачи. Так нормально или есть лучшие решения?

А как использовать XML? У меня v8.2. В этом случае куда смотреть?
...
Рейтинг: 0 / 0
Запрос с неизвестным числом колонок
    #34522715
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В этом случае лучше смотреть на v9. ИМХО
...
Рейтинг: 0 / 0
Запрос с неизвестным числом колонок
    #34525309
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DB2Adventurerтаблица CUSTOMERS(ID, DISTRICT_ID, REG_DATE).
На этапе выполнения пользователь выбирает год по который нужно вывести распределение количества клиентов в каждом районе по годам регистрации.

DISTRICT/Year 2002 2003 2004
1 5 3 5
2 7 3 6
3 9 4 6
Я у себя реализовал это, используя процедурную логику, примерно так:
1. Выясняются все различные значения REG_DATE.
2. На основе 1 динамически строится запрос:
Код: plaintext
1.
2.
3.
4.
5.
select 
  district_id
, count(case when reg_date=reg_date1 then id else cast(null as int) end) as reg_date1
...
, count(case when reg_date=reg_dateN then id else cast(null as int) end) as reg_dateN
group by district_id
Здесь reg_date1, ..., reg_dateN - все различные значения.
То, как они вставляются в динамический запрос, зависит от типа данных поля REG_DATE (т.е. если это строка, надо оборочивать ее в кавычки, если число - не надо и т.д.).
В примере предполагается, что это int.
...
Рейтинг: 0 / 0
Запрос с неизвестным числом колонок
    #34527892
DB2Adventurer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
СПасибо всем за помощь. 2gardenman за что я узнал, что такое crosstable&pivoting. Тяжело искать не зная, как называется искомое :)
2Mark Barinstein за решение.

Сделал так:
Код: 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.
CREATE PROCEDURE DB2ADMIN.REPORT_BY_YEAR ( IN p_begin INTEGER,
                                           IN p_end INTEGER)
    SPECIFIC DB2ADMIN.REPORT_BY_YEAR
    DYNAMIC RESULT SETS  1 
------------------------------------------------------------------------
-- SQL Хранимая процедура
    -- v_begin
    -- v_end
------------------------------------------------------------------------
P1: BEGIN
    DECLARE v_current INTEGER;
    DECLARE v_dynSQL     CLOB;
    DECLARE c_too_many_columns CONDITION FOR SQLSTATE '99006';
    -- Объявить указатель
    DECLARE c_report CURSOR WITH RETURN FOR v_cur_stmt;

    SET v_dynSQL = 'select t.tname ';
    SET v_current = p_begin;

    IF  p_end - p_begin >  254  THEN
        SIGNAL c_too_many_columns SET MESSAGE_TEXT = 'Число колонок не должно превышать 255. Уменьшите диапазон по годам';
    END IF;

    WHILE (v_current <= p_end) DO
       SET  v_dynSQL = v_dynSQL || ', SUM( CASE t.tyear WHEN ' || RTRIM(CHAR(v_current)) || ' THEN t.tcnt END ) as "' || RTRIM(CHAR(v_current)) || '"';
       SET  v_current = v_current +  1 ;
    END WHILE;

    SET v_dynSQL = v_dynSQL || ' FROM( SELECT d.ID as ID, COALESCE( d.NAME, ''По всем филиалам'' ) AS TNAME  , YEAR(c.reg_date) AS TYEAR,  COUNT(c.ID ) AS TCNT ' ||
    ' FROM db2admin.districts d LEFT JOIN db2admin.customers c ON d.ID = c.district_id GROUP BY GROUPING SETS( ( d.ID, d.NAME ), () ) , c.reg_date ORDER BY COALESCE (d.ID, 0) ) t GROUP BY t.ID, t.TNAME ORDER BY t.ID';
    -- Указатель оставлен открытым для программы клиента
    PREPARE v_cur_stmt FROM v_dynSQL;
    OPEN c_report;
END P1 
...
Рейтинг: 0 / 0
Запрос с неизвестным числом колонок
    #34531197
ggv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ggv
Гость
http://blogs.ittoolbox.com/database/technology/archives/pivot-query-12757
http://blogs.ittoolbox.com/database/technology/archives/unpivot-query-12798
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Запрос с неизвестным числом колонок
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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