Mysql 分组依据,将行转换为无聚合的列
我需要在查询期间对表进行分组,直到我知道我是在查询之后才这样做的——使用代码作为我的分组是相当复杂的。但有了新的数据,这似乎需要几分钟的时间,我想还有更好的方法 我当前的查询结果如下:Mysql 分组依据,将行转换为无聚合的列,mysql,sql,nhibernate,Mysql,Sql,Nhibernate,我需要在查询期间对表进行分组,直到我知道我是在查询之后才这样做的——使用代码作为我的分组是相当复杂的。但有了新的数据,这似乎需要几分钟的时间,我想还有更好的方法 我当前的查询结果如下: 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 我把它转换成: FK
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吗?(我认为这应该比我用代码做这件事快得多)
- 名字可以是任何东西
- 我有很多列A,B,C(比如20-30)。结果列的数量很容易达到数千,因为平均项目有大约100个名称
- 我有10-20列,我应该按它们分组,但是按FKId进行单个分组是可以的——这些列是相同的
- 我们使用不同的SQL数据库,所以我不能使用像
这样的特定函数。我知道我们经常使用MySQL、MsSQL和SQLitePIVOT
- 如果有什么不同,我们会使用NHibernate
- 如果使用了特定的函数,我也很荣幸为MySQL提供了解决方案。我们80%使用它,如果我至少能为MySQL这样做的话,它将大大提高平均性能
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;
这是一个很好的解决方案,但不幸的是,它需要知道名称-我在形成查询时不知道它们,我在代码中遇到了类似的解决方案。在我看来,最好的选择是使用变量名在应用程序代码中形成查询。创建查询后,使用execute命令在SQL中执行该查询。请参阅将要使用的数据库中执行动态SQL查询的语法