2013-08-03 4 views
0

제목 : 문제 및 해당 작업. 환경 : SQL Server 2008 이상 데이터베이스 테이블 : 문제점, 작업 및 문제점 작업sql 동적 행을 열로 변환

단일 한 문제와 관련된 작업을 처리하는 입력 화면이 하나 있다고 가정 해 봅시다.

우리는 이슈 1을 다루고 있으며 체크하기 위해 7 가지 작업이 나열되어 있습니다.

사용자는 완료된 7 개의 작업 중 3 개를 확인하고 데이터베이스에 저장합니다.

같은 행에 7 개의 작업으로 이슈 1을 표시하는 SQL을 작성할 수 있습니까? 3 개만 검사 했으므로 나머지는 null이어야합니다.

또한 사용자가 확인한 내용을 나타내는 IssuesTasks 조인 테이블에는 3 개의 작업 만 있습니다. PIVOT 기능에

+4

예, [동적 SQL과 함께 피벗 함수] (http://stackoverflow.com/search?tab=newest&q=%5bpivot%5d%5bsql-server%5d%20dynamic)를 사용하여 결과를 얻을 수 있습니다. – Taryn

답변

0

를 사용하여 SQL 서버 빌드 :

SELECT <non-pivoted column>, 
    [first pivoted column] AS <column name>, 
    [second pivoted column] AS <column name>, 
    ... 
    [last pivoted column] AS <column name> 
FROM 
    (<SELECT query that produces the data>) 
    AS <alias for the source query> 
PIVOT 
(
    <aggregation function>(<column being aggregated>) 
FOR 
[<column that contains the values that will become column headers>] 
    IN ([first pivoted column], [second pivoted column], 
    ... [last pivoted column]) 
) AS <alias for the pivot table> 
<optional ORDER BY clause>; 

당신은 다른 테이블에 테이블 반환 식을 변경하려면 PIVOT 및 UNPIVOT 관계 연산자를 사용할 수 있습니다. PIVOT은 식의 한 열에서 고유 값을 출력의 여러 열로 바꿈으로써 테이블 반환 식을 회전시키고 최종 출력에서 ​​원하는 나머지 열 값에 필요한 집계를 수행합니다. UNPIVOT은 테이블 반환 식의 열을 열 값으로 회전하여 PIVOT에 대한 반대 작업을 수행합니다.

간단한의 AdventureWorks 예제 :

-- Pivot table with one row and five columns 
SELECT 'AverageCost' AS Cost_Sorted_By_Production_Days, 
[0], [1], [2], [3], [4] 
FROM 
(SELECT DaysToManufacture, StandardCost 
    FROM Production.Product) AS SourceTable 
PIVOT 
(
AVG(StandardCost) 
FOR DaysToManufacture IN ([0], [1], [2], [3], [4]) 
) AS PivotTable; 

더 복잡한 예 :

USE AdventureWorks2008R2; 
GO 
SELECT VendorID, [250] AS Emp1, [251] AS Emp2, [256] AS Emp3, [257] AS Emp4, [260] AS Emp5 
FROM 
(SELECT PurchaseOrderID, EmployeeID, VendorID 
FROM Purchasing.PurchaseOrderHeader) p 
PIVOT 
(
COUNT (PurchaseOrderID) 
FOR EmployeeID IN 
([250], [251], [256], [257], [260]) 
) AS pvt 
ORDER BY pvt.VendorID; 
당신이 당신의 테이블에 대한 스키마를 제공하지 한 동안

For more information see here

0

, 그것은 당신에게 정확한 쿼리를 작성하는 것은 쉽지 않다 하지만 이것 좀 봐

select 
    I.Id, 
    I.Name, 
    max(case when IT.TaskId = 1 then T.Name end) as Task1, 
    max(case when IT.TaskId = 2 then T.Name end) as Task2, 
    max(case when IT.TaskId = 3 then T.Name end) as Task3, 
    max(case when IT.TaskId = 4 then T.Name end) as Task4, 
    max(case when IT.TaskId = 5 then T.Name end) as Task5, 
    max(case when IT.TaskId = 6 then T.Name end) as Task6, 
    max(case when IT.TaskId = 7 then T.Name end) as Task7 
from Issues as I 
    left outer join IssuesTasks as IT on IT.IssueId = I.Id 
    left outer join Tasks as T on T.Id = IT.TaskID 
group by I.Id, I.Name; 

SQL FIDDLE

0

만약 이것이 정결하지 않다면 실례합니다. 나는 여전히 여기 주위의 규칙 (stackoverflow의 오랜 시간 독자, 첫날 게시)에 익숙해지고있다. 나는 사실 내 블로그에이 기사를 썼는데 진심으로 도움이 될 것이라고 생각한다. 기본적으로, 당신은 동적으로 피벗 열 값을 구축하고이 같은 동적으로 구축 된 PIVOT 쿼리로에 전달할 수 있습니다 : 당신은 샘플 데이터에 대한 자세한 설명이 필요한 경우

IF (OBJECT_ID('tempdb..#TEMP') is not null) DROP TABLE #TEMP 
DECLARE @cols NVARCHAR(2000) 
SELECT DISTINCT DATE 
INTO #TEMP 
FROM T_EMPLOYEE_PRODUCTIVITY 

SELECT @cols = ISNULL(@cols + ',', '') + '[' + CONVERT(NVARCHAR, DATE) + ']' 
FROM #TEMP 
ORDER BY DATE 
SELECT @cols 
DECLARE @query NVARCHAR(4000) 
SET @query = 'SELECT EMPLOYEE_NAME, ' + @cols + 
'FROM 
(
SELECT EMPLOYEE_NAME, DATE, UNITS 
FROM T_EMPLOYEE_PRODUCTIVITY 
) AS SourceTable 
PIVOT 
(
SUM(UNITS) 
FOR DATE IN ('+ @cols + ') 
) AS PivotTable 
ORDER BY EMPLOYEE_NAME' 
SELECT @query 

EXECUTE(@query) 

, 여기를 체크 아웃 : http://thrillhouseblog.blogspot.com/2013/08/dynamic-pivot-query-in-tsql-microsoft.html

이 도움이 되었기를 바랍니다.