MySQL Выберите запрос для создания динамического столбца. Результат

Мне нужно написать запрос, который динамически возвращает столбец. Например, у меня есть таблица tblTest со столбцами:

Id, Name,   Type,  Amount
1, Receipt, Cash   100
2, Receipt, Card   200
3, Receipt, Cheque 250
4, Receipt, Card   150
5, Receipt, Cash   100
6, Payment, Cash   300
7, Payment, Cheque 400

SQL-запрос:

SELECT
    Name,
    SUM(CASE WHEN Type = 'Cash'   THEN Amount ELSE 0 END) Cash,
    SUM(CASE WHEN Type = 'Card'   THEN Amount ELSE 0 END) Card,
    SUM(CASE WHEN Type = 'Cheque' THEN Amount ELSE 0 END) Cheque
FROM tblTest
GROUP BY
    Name;

оно возвращает меня,

введите здесь описание изображения

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

Заранее спасибо..


person Vijay    schedule 17.07.2018    source источник
comment
Что вы имеете в виду под динамическим? Вы имеете в виду, что при изменении БД SUM пересчитывается, а ваш html переписывается?   -  person Yuri    schedule 17.07.2018
comment
@Yuri в указанном выше столбце таблицы Значение типа Cash, Card, Cheque не определено заранее, оно может увеличиваться с помощью Paytm, кошелька и т. Д.   -  person Vijay    schedule 17.07.2018
comment
Рассмотрите возможность решения проблем с отображением данных в коде приложения. Это намного проще.   -  person Strawberry    schedule 17.07.2018
comment
Динамический конструктор   -  person Rick James    schedule 18.07.2018


Ответы (2)


Вам нужно использовать Динамический свод

Создайте свой сводной запрос динамически.

Основные шаги следующие

  1. Объявите переменную @sql для переноса вашей SUM функции и CASW WHEN выражения.
  2. используйте CONCAT, чтобы объединить функцию SUM и строку выражения CASW WHEN и основную строку select.
  3. используйте функцию EXECUTE, выполняйте SQL динамически.

выглядеть так.

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'SUM(CASE WHEN Type =''',
      Type,
      ''' THEN Amount END) AS ',
      Type
    )
  ) INTO @sql
FROM tblTest;

SET @sql = CONCAT('SELECT
                    Name,', @sql, ' 
                   FROM tblTest
                   GROUP BY
                    Name;');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

Результат

    Name    Cash    Card    Cheque
1   Payment 300     NULL    400
2   Receipt 200      350    250

SQLfiddle

person D-Shih    schedule 17.07.2018

Хей,

Надеюсь, я вас правильно понял.

select name, type, sum(CASE WHEN Type in (select DISTINCT sub.type from 
tblTest sub) THEN Amount ELSE 0 END) as "sum" from tblTest
group by name, type;
person sirh3e    schedule 17.07.2018