2015-06-27 2 views
3

У меня есть таблица с двумя столбцами, следующее схеме:Mysql транспонировать сложную таблицу SQL запросов динамически

create table scan(`application_name` varchar(255) NOT NULL, `defect_type` varchar(255) NOT NULL); 

И данных заполняется соответствующим образом. В таблице хранятся данные для «Приложения» и соответствующий «Тип дефекта». Я хочу выполнить следующие 2 действия в этой таблице:

  1. Получите 3-й «Тип дефекта» конкретного приложения в процентах.
  2. Перенос вывода сверху, где значения в «Тип дефекта» (defect_type) становятся столбцами и соответствующим процентом (finalPercent) в качестве его значения.

Я могу достичь 1, следующее в SQL Fiddle:

SQLFiddle

Однако, я не могу перенести выход в соответствии с требованием. В идеале должна быть одна строкой следующей после как 1 &-вместе:

application_name | CrossSide | CSS | XML 
     A   | 33.33 | 33.33 | 16.67 

Спасибо!

ответ

2

Вы можете создать динамический запрос шарнирный с group_concat, а затем выполнить его:

set @sql = null; 

set @total = (select count(*) as totalcount from scan where application_name = "a"); 

select group_concat(distinct 
    concat(
     'round(((count(case when defect_type = ''', 
     defect_type, 
     ''' then application_name end)/ @total) * 100), 2) as `', 
     defect_type, '`' 
    ) 
) into @sql 
from (select defect_type 
     from scan 
     where application_name = "a" 
     group by defect_type 
     order by count(defect_type) desc 
     limit 3) t; 

set @sql = concat(
'select application_name, ', @sql, 
' from scan 
where application_name = "a" 
group by application_name' 
); 

prepare stmt from @sql; 
execute stmt; 
deallocate prepare stmt; 

SQLFiddle

+0

Спасибо. Есть ли способ не жестко кодировать «CrossSide», «CSS», «XML» и динамически заполнять значения столбцов? Эти значения могут быть дефектами любого типа, и я просто хотел Top3 defect_type. – awattal

+0

Awesome. Это отлично подходит для моих сценариев, и я понимаю его сложность. – awattal

Смежные вопросы