이 쿼리 유형 (행에서 열로 값을 변환 함)은 피벗 쿼리 (SQL Server) 또는 크로스 탭 (액세스)으로 명명됩니다. 열 고정 수로
- :
는 (일반적으로) 피벗 쿼리의 두 종류가있다.
- 동적 열 수를 사용합니다.
SQL Server 지원 두 가지 유형 만 :
- 데이터베이스 엔진 (쿼리 언어 : T-SQL) 지원에만 직접 피벗 열 (1) 간접적으로 (2)
의 고정 된 수의 쿼리
- Analysis Services (쿼리 언어 : MDX)는 직접 두 유형 (1 & 2)을 모두 지원합니다. 또한 OPENQUERY/OPENROWSET 함수를 사용하여 T-SQL에서 (MDX) Analysis Service 데이터 원본을 쿼리하거나 네 부분으로 구성된 이름이있는 연결된 서버를 사용할 수 있습니다.
T-SQL (전용) 솔루션 : 첫 번째 유형 (1)의 경우
는 SQL 서버로 시작하는 2005 당신은 PIVOT 연산자 사용할 수 있습니다
SELECT pvt.*
FROM
(
SELECT Date, Id, Status_ID, Status_Time
FROM Table
) src
PIVOT (SUM(src.Status_Time) FOR src.Status_ID IN ([1], [2], [3])) pvt
또는
SELECT pvt.Date, pvt.Id, pvt.[1] AS Lunch, pvt.[2] AS [Break], pvt.[3] Vacation
FROM
(
SELECT Date, Id, Status_ID, Status_Time
FROM Table
) src
PIVOT (SUM(src.Status_Time) FOR src.Status_ID IN ([1], [2], [3])) pvt
을
동적 수의 열 (2)의 경우 T-SQL은 간접 솔루션 인 동적 쿼리 만 제공합니다. 먼저 Status_ID에서 모든 고유 값을 찾아야하며 다음으로 최종 쿼리를 작성해야합니다.
DECLARE @SQLStatement NVARCHAR(4000)
,@PivotValues NVARCHAR(4000);
SET @PivotValues = '';
SELECT @PivotValues = @PivotValues + ',' + QUOTENAME(src.Status_ID)
FROM
(
SELECT DISTINCT Status_ID
FROM Table
) src;
SET @PivotValues = SUBSTRING(@PivotValues,2,4000);
SELECT @SQLStatement =
'SELECT pvt.*
FROM
(
SELECT Date, Id, Status_ID, Status_Time
FROM Table
) src
PIVOT (SUM(src.Status_Time) FOR src.Status_ID IN ('[email protected]+')) pvt';
EXECUTE sp_executesql @SQLStatement;
병합 상태 및 일부 임시 테이블을 사용하여 데이터를 준비 했습니까? –
나는 그렇지 않다. 나는 이것을 지금 보게 될 것이다. 고맙습니다. – Jessica