LINUX.ORG.RU

[SQL] Динамическое формирование столбцов

 


0

1

Понимаю, что лучше было бы задать вопрос на каком-нибудь специализированном форуме, но на лоре, как известно, имеются специалисты по всему.

Простейшим sql-запросом я получаю два столбца содержащих строки:

mysql> select
    -> 
    -> DF_NMPLT,
    -> if (
    ->     locate(char(32), DF_TEXT) = 0,
    ->     substring(DF_TEXT, 2, char_length(DF_TEXT) - 5),
    ->     substring(DF_TEXT, 2, locate(char(32), DF_TEXT) - 6)
    ->    ) as "echelon"
    -> 
    -> from FPLDOCM
    -> 
    -> where
    -> DF_FLAG = 'a' and
    -> left(DF_TEXT, 1) = 'S';
+----------+---------+
| DF_NMPLT | echelon |
+----------+---------+
| 02       | 096     |
| 02       | 096     |
| 02       | 116     |
| 02       | 106     |
| 02       | 111     |
| 06       | 056     |
| 06       | 096     |
| 06       | 096     |
| 06       | 096     |
| 02       | 096     |
| 02       | 096     |
| 02       | 091     |
| 02       | 106     |
| 02       | 106     |
| 02       | 106     |
| 02       | 106     |
| 02       | 106     |
| 02       | 096     |
| 02       | 096     |
| 02       | 096     |
| 02       | 096     |
| 02       | 096     |
| 02       | 096     |
| 02       | 056     |
| 02       | 056     |
| 02       | 111     |
| 02       | 106     |
| 02       | 056     |
| 02       | 106     |
| 02       | 116     |
| 02       | 101     |
| 02       | 104     |
| 02       | 111     |
| 02       | 101     |
| 02       | 119     |
| 02       | 101     |
| 02       | 095     |
| 02       | 106     |
| 02       | 101     |
| 02       | 063     |
| 02       | 096     |
| RZ       | 096     |
| RZ       | 096     |
| OL       | 106     |
| 10       | 106     |
| RZ       | 106     |
| 03       | 116     |
| RZ       | 106     |
| RZ       | 101     |
| RZ       | 101     |
| RZ       | 002     |
| 06       | 101     |
| 06       | 101     |
| 06       | 096     |
| 06       | 101     |
| 06       | 101     |
| 06       | 054     |
| 06       | 111     |
| 06       | 101     |
| 06       | 096     |
| 06       | 096     |
| 02       | 096     |
| 06       | 101     |
| 06       | 101     |
| 02       | 116     |
+----------+---------+
65 rows in set (0.00 sec)

mysql>

Каждый из них принимает значение из ограниченного набора. Первый для ясности назовем номером пульта, второй эшелоном.

В конечном счете мне необходимо написать единый запрос, который представлял бы данные в виде таблицы, где каждая строка соответствует эшелону, а каждый столбец номеру пульта, все в единственном экземпляре, а на пересечении количество встречаемых «совпадений»: данного эшелона для данного пульта.

Пытался найти информацию для динамического формирования столбцов, но не нашел.

Выглядеть должно как-то так:

+---------+---------+---------+---------+
| Echelon | Pult-01 | Pult-02 | Pult-03 |
+---------+---------+---------+---------+
|   151   |     0   |    10   |    9    |
+---------+---------+---------+---------+
|   141   |    40   |   102   |   19    |
+---------+---------+---------+---------+
|   ...   |   ...   |   ...   |   ...   |
+---------+---------+---------+---------+
|    30   |    15   |    36   |    0    |
+---------+---------+---------+---------+

Есть какие-нибудь мысли, советы? Повторюсь, необходимо написать единый запрос.

Спасибо.


> В конечном счете мне необходимо написать единый запрос

А зачем Вы себя так ограничиваете? Напишите два запроса, первым посчитайте колонки (ваши пульты), а второй генерируйте по результату первого.

Eshkin_kot ★★
()
Ответ на: комментарий от Eshkin_kot

Если вы о вложенных запросах, то не могли бы описать как динамически добавлять колонки в результат?

Если предлагаете на каком-либо ЯП распарсить результат первого запроса и самому сформировать таблицу - то не вариант.

Ограничения архитектуры ПО - необходимо написать единый запрос, который должен представлять данные в описанном виде.

Fredrik
() автор топика

наводка на CREATE FUNCTION, SELECT INTO, вообщем хранимыми процедурами можно разрулить!

xspirit
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.