Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 分组依据,将行转换为无聚合的列_Mysql_Sql_Nhibernate - Fatal编程技术网

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数据库,所以我不能使用像
    PIVOT
    这样的特定函数。我知道我们经常使用MySQL、MsSQL和SQLite
  • 如果有什么不同,我们会使用NHibernate
  • 如果使用了特定的函数,我也很荣幸为MySQL提供了解决方案。我们80%使用它,如果我至少能为MySQL这样做的话,它将大大提高平均性能

基本上,您希望转换数据。这是你可以尝试的。它应该适用于所有数据库,但您需要事先知道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;

这是一个很好的解决方案,但不幸的是,它需要知道名称-我在形成查询时不知道它们,我在代码中遇到了类似的解决方案。在我看来,最好的选择是使用变量名在应用程序代码中形成查询。创建查询后,使用execute命令在SQL中执行该查询。请参阅将要使用的数据库中执行动态SQL查询的语法