2014-12-17 2 views
1

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

Мои текущие результаты запроса в этом:

FKId | Name | A | B | C 
1  Alpha 2 3 2 
1  Beta 2 5 7 
2  Alpha 8 1 10 
2  Beta 7 -5 6 
2  Gamma 1 2 3 

И я преобразовать его в этом:

FKId | Alpha[A] | Alpha[B] | Alpha[C] | Beta[A] | Beta[B] | Beta[C] | Gamma[A] | Gamma[B] | Gamma[C] 
1  2   3   2   2   5  7 
2  8   1   10   7   -5  6   1   2   3 

Можно ли делать с SQL? (И я предполагаю, что это должно быть гораздо быстрее, чем если бы я сделать это с кодом)

  • Названия могут быть любыми
  • У меня есть очень большое количество colums A, B, C (например, 20 - 30). Количество столбцов результатов может легко переходить к тысячам, так как средний проект имеет около 100 имен.
  • У меня есть 10-20 столбцов, которые я должен сгруппировать, но сделать одну группу с помощью FKId в порядке - эти столбцы одинаковы.
  • Мы используем разные SQL-базы данных, поэтому я не могу использовать определенные функции, такие как PIVOT. Я знаю, что мы использовали MySQL, MsSQL и SQLite много.
  • Мы используем NHibernate, если это имеет значение.
  • Я бы также отметил решение, сделанное для MySQL, если используются определенные функции. Мы используем его в 80%, и это уже значительно улучшит среднюю производительность, если я смогу сделать это, по крайней мере, для MySQL.

ответ

0

В принципе, вы хотите перенести данные. Вот что вы можете попробовать. Он должен работать во всех базах данных, но вы должны знать, столбцы A, B, C, и т.д. заранее:

create table my_table (
    fkid integer, 
    name varchar(10), 
    a integer, 
    b integer, 
    c integer 
); 

insert into my_table values(1,'alpha',2,3,2) 
,(1,'beta',2,5,7) 
,(2,'alpha',8,1,10) 
,(2,'beta',7,-5,6) 
,(2,'gamma',1,2,3); 


select fkid 
, max(case when name = 'alpha' then a else null end) as alphaa 
, max(case when name = 'alpha' then b else null end) as alphab 
, max(case when name = 'alpha' then c else null end) as alphac 
, max(case when name = 'beta' then a else null end) as betaa 
, max(case when name = 'beta' then b else null end) as betab 
, max(case when name = 'beta' then c else null end) as betac 
, max(case when name = 'gamma' then a else null end) as gammaa 
, max(case when name = 'gamma' then b else null end) as gammab 
, max(case when name = 'gamma' then c else null end) as gammac 
from my_table 
group by fkid; 
+0

Это хорошее решение, но, к сожалению, это требует, чтобы знать имена - я не знаю их на время Я формирую запрос – Archeg

+0

Я столкнулся с аналогичным решением в своем коде. На мой взгляд, лучшей альтернативой является формирование запроса в коде приложения с использованием имен переменных. После создания запроса выполните этот запрос в SQL с помощью команды execute. См. Синтаксис для выполнения динамического SQL-запроса в базе данных, которую вы будете использовать. –

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