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로 할 수 있습니까?

  • 이름은 무엇
  • I는 A, B, C (- 30 20 등) colums의 매우 큰 숫자가 될 수있다 (그리고 나는 코드로이 작업을 수행 할 경우보다 훨씬 더 빨리해야 가정). 평균 프로젝트의 이름이 약 100 개이므로 결과 열의 수는 쉽게 수천 개가 될 수 있습니다.
  • 필자는 그룹화해야하는 10-20 열과 비슷하지만 FKId가 단일 그룹을 만드는 것이 좋습니다.이 열은 동일합니다.
  • 다른 SQL DB를 사용하므로 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

나는 내 코드에서 비슷한 해결책을 겪었다. 내 생각에 가장 좋은 대안은 변수 이름을 사용하여 응용 프로그램 코드에서 쿼리를 구성하는 것입니다. 쿼리가 생성되면 execute 명령을 사용하여 SQL에서 해당 쿼리를 실행합니다. 사용할 DB에서 동적 SQL 쿼리를 실행하는 구문을 참조하십시오. –