2011-09-01 6 views
1

지금 며칠 동안 나를 괴롭 히고있는 질문이 있습니다.SQL 테이블에서 데이터 삽입 및 변환

  • 날짜
  • ID
  • Status_ID
  • 에서는 Start_Time
  • END_TIME
  • Status_Time (초) (그들은 초, 특정 상태에 있었다 어떻게 링)
  • : 내가 가진 테이블을 가지고

Status_ID가 열로 그룹화 된 다른 테이블에이 데이터를 넣으려고합니다. . 등 (초) (초) (초)

  • 날짜
  • ID
  • 점심
  • 브레이크
  • 휴가,
:이 표는이 같은 열이 있습니다

따라서 Status_ID 2와 3은 휴가 상태, Status_ID 1 점심 시간 등으로 그룹화 될 수 있습니다.

while 루프에서 중첩 된 Case를 수행하여 모든 행을 다른 테이블에 삽입하는 방법을 생각했습니다. 그러나, 나는이 데이터를 행의 Status_ID에서 현재 그룹화 된 열에 삽입하는 것을 감당할 수 없다.

+0

병합 상태 및 일부 임시 테이블을 사용하여 데이터를 준비 했습니까? –

+0

나는 그렇지 않다. 나는 이것을 지금 보게 될 것이다. 고맙습니다. – Jessica

답변

2

WHILE 루프가 필요하지 않습니다. (가 비 영구적, 계산 된 열 않는 한) 테이블의 status_time을 유지 또한

SELECT 
    date, 
    id, 
    SUM(CASE WHEN status_id = 1 THEN status_time ELSE 0 END) AS lunch, 
    SUM(CASE WHEN status_id = 2 THEN status_time ELSE 0 END) AS break, 
    SUM(CASE WHEN status_id = 3 THEN status_time ELSE 0 END) AS vacation 
FROM 
    My_Table 
GROUP BY 
    date, 
    id 

는 실수이다. 동일한 데이터를 효과적으로 데이터베이스의 두 위치에 저장하면 결과적으로 불일치가 발생하게됩니다. 상태 유형별로 시간을 구분하여이 데이터를 다른 테이블로 푸시하는 경우에도 마찬가지입니다. 데이터를 보유 할 새 테이블을 작성하지 말고 필요할 때 데이터를 가져 오기 위해 조회를 사용하십시오.

+1

이것은 내가 지금까지 가장 도움이되었습니다. 감사! – Jessica

0

이 쿼리 유형 (행에서 열로 값을 변환 함)은 피벗 쿼리 (SQL Server) 또는 크로스 탭 (액세스)으로 명명됩니다. 열 고정 수로

  1. :

    는 (일반적으로) 피벗 쿼리의 두 종류가있다.

  2. 동적 열 수를 사용합니다.

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; 
관련 문제