Создание динамического c пивота в Mysql - PullRequest
1 голос
/ 13 января 2020

У меня есть таблица с контактной информацией о клиентах. В таблице содержатся адреса электронной почты и другие персональные данные, а также 300 и 400 столбцов с именами списков, в которых контакт либо подписан, либо отписан, либо имеет нулевое значение (так что его нет в этом списке вообще). Для каждого списка (имя столбца) у меня есть дополнительный столбец с датой (подписки или отмены подписки)

Очень трудно обработать этот список.

Теперь я пытаюсь сделать запрос который дает мне все почтовые адреса с именами столбца, где поле не является нулевым. Таким образом, я вижу, какой клиент в каком списке. Я хотел сделать это динамически (у меня есть разные списки с разным количеством столбцов, чтобы я мог повторно использовать код)

Я пробовал это с Case (не так Dynami c), но это занимает много времени способ кодирования.

Я знаю, что есть другие подобные вопросы, но я не совсем понимаю ответы. Это также мой первый вопрос, предложения по улучшению всегда приветствуются.

Заранее большое спасибо. Пример кода должен быть таким:

SELECT  test.email,
    (
        CASE 
            WHEN  Test.Column_Status <>'0'
            THEN Columname 
            ELSE 0 
        END
    )
FROM  test
GROUP BY test.email

1 Ответ

0 голосов
/ 13 января 2020

С уважением, вашу проблему практически невозможно решить с помощью простых MySQL запросов. Вы уже обнаружили, насколько велики будут ваши запросы даже для сводки stati c. Для выполнения динамического поворота c (когда имена столбцов определяются фактическими данными в вашей таблице) требуется функция MySQL, вызывающая путаницу Подготовленные операторы . Это гигантская c боль в шее для разработки, отладки и поддержки.

Вам будет намного лучше выполнять эту работу с языком программирования (php, nodejs, c# , java, даже PERL) с хорошими функциями управления списками.

@ Strawberry также правильно, что вы должны нормализовать эти данные. Вместо таблицы с

data
  id
  email
  status1
  status2
  status4
   ...
  status400

Используйте две таблицы:

data
  id 
  email

detail
  id
  itemname 
  value

Итак, строка, подобная этой, в вашей таблице

 id  email               is_mouse   is_duck   is_dog   is_cartoon_character
 17  mickey@disney.com     1           0         0         1

будет выглядеть следующим образом

data
   17 mickey@disney.com

detail
   17   'is_mouse'               1
   17   'is_cartoon_character'   1
   17   'is_duck'                0   (you can omit this row ... )
   17   'is_dog'                 0   (... and this one, if you wish)

Большинство разработчиков баз данных предпочитают эту нормализованную форму. Одна веская причина: проще добавлять новые атрибуты, такие как is_ninja_turtle, чем если бы каждый атрибут был столбцом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...