2013-09-08 3 views
1

Мой запрос прост - он захватывает банки и их суммы транзакций в месяц/год:транспонирования в столбцах

select bank_name, 
    sum(payment_sum), 
    CONCAT(MONTH(payment_due_date), '/', YEAR(payment_due_date)) as month_year 
from bank 
join finance 
    on bank.bank_id = finance.bank_id 
group by bank_name, month_year 

Возвращает:

enter image description here

Как transponse значения строки (month_year) в столбцы, за которым следует payment_sum, также перенесенный на соответствующие столбцы, созданные month_year?

Я ищу способ найти сумму платежей для каждого банка по месяцам.

Я просмотрел this тему, но мои потребности кажутся разными.

ответ

1

К сожалению, у MySQL нет функции PIVOT, которая преобразует строки в столбцы, поэтому вам нужно будет использовать агрегатную функцию с выражением CASE.

Основной синтаксис запроса будет, если у вас есть ограниченное или известное количество столбцов:

select bank_name, 
    sum(case when month_year ='10/2011' then payment_sum else 0 end) `10/2011`, 
    sum(case when month_year ='11/2011' then payment_sum else 0 end) `11/2011`, 
    sum(case when month_year ='12/2011' then payment_sum else 0 end) `12/2011` 
from 
(
    select bank_name, 
    payment_sum, 
    CONCAT(MONTH(payment_due_date), '/', YEAR(payment_due_date)) as month_year 
    from bank 
    join finance 
    on bank.bank_id = finance.bank_id 
) d 
group by bank_name; 

Но для вашей ситуации, это звучит, как вы будете иметь неизвестное количество дат, так что вы могли бы необходимо использовать подготовленное заявление для создания динамического sql:

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'sum(case when month_year = ''', 
     CONCAT(MONTH(payment_due_date), '/', YEAR(payment_due_date)), 
     ''' then payment_sum end) AS `', 
     CONCAT(MONTH(payment_due_date), '/', YEAR(payment_due_date)), '`' 
    ) 
) INTO @sql 
from finance; 

SET @sql 
    = CONCAT('SELECT bank_name, ', @sql, ' 
       from 
       (
       select bank_name, 
        payment_sum, 
        CONCAT(MONTH(payment_due_date), ''/'', YEAR(payment_due_date)) as month_year 
       from bank 
       join finance 
        on bank.bank_id = finance.bank_id 
      ) d 
       group by bank_name;'); 

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