2012-05-24 1 views
1

나는 내가 테이블의 크로스 탭 쿼리를 만들 수 있습니다 TableMicrosoft Access에서 크로스 탭 쿼리 - MSSQL보기로 변환

(ODBC를 실제 MSSQL 테이블에 링크) 액세스에 다음 테이블로 변환해야 이 형식 다음 Cross-tab

액세스에서 생성되는 SQL이다 : 나는 아무 소용 MSSQL 내에서 동일한 SQL을 만들려고 한

TRANSFORM First(dbo_85137_PHY_Long_MP.[StatColumnValue]) AS FirstOfStatColumnValue 
SELECT dbo_85137_PHY_Long_MP.[StatDate] 
FROM dbo_85137_PHY_Long_MP 
GROUP BY dbo_85137_PHY_Long_MP.[StatDate] 
PIVOT dbo_85137_PHY_Long_MP.[StatColumnName]; 

(VI를 만들려고 ew)

+0

원하는 것은 흔히 PIVOT 쿼리라고하며, MySQL이 기본적으로 지원하지 않는 것입니다. 이 질문은 시작하는 데 도움이 될지 모르지만 그것은 추한 쿼리가됩니다. http://stackoverflow.com/questions/7888631/how-to-display-rows-as-columns-in-mysql – Andrew

+3

@Andrew He doesn 어디서나 MYSQL을 언급하지 않습니다! – Bridge

+0

나를 위해 더 많은 커피, 보스! 나는 할 수 있겠다. ... – Andrew

답변

5

SQL Server를 사용하고 있으므로 PIVOT 연산자를 사용하려고합니다. 정적 PIVOT 또는 동적 PIVOT을 통해이 두 가지 방법으로 수행 할 수 있습니다.

정적 PIVOT은 회전해야하는 각 열을 코딩한다는 것을 의미합니다. 당신이 많은 칼럼을 가지고있는 것처럼 보였기 때문에 나는 이런 식으로하고 싶지 않을 것입니다. 그러나 코드는 다음과 유사 할 것입니다 :

여기
create table t1 
(
    statno int, 
    statdate datetime, 
    statcolumnname varchar(50), 
    statcolumnvalue int 
) 

insert into t1 values (1, '4/1/2012 12:15:00', 'MPB-1MA.MP00-1MA', 17) 
insert into t1 values (1, '4/1/2012 12:15:00', 'MPB-1MA.MP01-1MA', 18) 
insert into t1 values (1, '4/1/2012 12:15:00', 'MPB-1MA.MP02-1MA', 18) 
insert into t1 values (1, '4/1/2012 12:15:00', 'MPB-1MA.MP03-1MA', 18) 
insert into t1 values (1, '4/1/2012 12:15:00', 'MPB-1ME.MP10-1ME', 26) 
insert into t1 values (1, '4/1/2012 12:15:00', 'MPB-1ME.MP11-1ME', 2) 
insert into t1 values (1, '4/1/2012 12:15:00', 'MPB-1ME.MP12-1ME', 2) 
insert into t1 values (1, '4/1/2012 12:15:00', 'MPB-2MC.MP08-2MC', 2) 
insert into t1 values (1, '4/1/2012 12:15:00', 'MPB-2MC.MP09-2MC', 22) 
insert into t1 values (1, '4/1/2012 12:15:00', 'MPB-2MC.MP0A-2MC', 22) 
insert into t1 values (1, '4/1/2012 12:15:00', 'MPB-2MC.MP0B-2MC', 22) 

select * 
from 
(
    select statdate, statcolumnname, statcolumnvalue 
    from t1 
) x 
pivot 
(
    min(statcolumnvalue) 
    for statcolumnname in ([MPB-1MA.MP00-1MA], [MPB-1MA.MP01-1MA], [MPB-1MA.MP02-1MA]) 
) p 

가 작동 예와 SQL Fiddle입니다.

많은 열이 있다면 매우 귀찮습니다. 따라서 동적 피벗을 사용하면 쿼리 실행시 회전 할 열 목록을 생성 할 수 있습니다. 코드는 다음과 같습니다.

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX); 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.statcolumnname) 
      FROM t1 c 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 


set @query = 'SELECT statdate, ' + @cols + ' from 
      (
       select statdate, statcolumnname, statcolumnvalue 
       from t1 
      ) x 
      pivot 
      (
       min(statcolumnvalue) 
       for statcolumnname in (' + @cols + ') 
      ) p ' 


execute(@query) 

두 가지 모두 동일한 결과를 제공합니다.

+0

당신은 매우 지적인 사람들을 거기 밖으로 데리고 나옵니다. 귀하의 답변에 감사드립니다. 슈퍼 유용한! – Thomas

+0

그건 그렇고, 동적 피벗 예제에 관한. 저장된 물품이나 재사용 할 수있는 물건으로 만들 수 있습니까? – Thomas

+0

예, 다시 사용할 수 있도록 저장 프로 시저에 저장할 수 있습니다. – Taryn