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

Мне нужно написать запрос, который возвращает столбец динамически. Например, у меня есть таблица 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 для этого.

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

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

Хей,

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

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;
Другие вопросы по тегам