2014-10-02 2 views
1

TSQL에서이 PIVOT 테이블을 제대로 작동 시키려면 심각한 문제가 있습니다. 여기 작은 PIVOT 테이블 도움말

는 ... 내가 PIVOT의 일종을하고 싶은 생각

Declare @MyAssigneeTable table (
          VDayID int, 
          VDate datetime, 
          StartTime varchar(100), 
          EndTime varchar(100), 
          PositionID int, 
          RoomID int, 
          RoomDesc varchar(100), 
          Position varchar(100), 
          SortOrder int, 
          Assignee varchar(100) 
         ) 



INSERT INTO @MyAssigneeTable VALUES (2264, '2013-10-23', '7 AM','12 PM',13,150,'Room 1','Position 1',99,'') 
INSERT INTO @MyAssigneeTable VALUES (2264, '2013-10-23', '7 AM','12 PM',14,150,'Room 1','Position 2',99,'Matt') 
INSERT INTO @MyAssigneeTable VALUES (2264, '2013-10-23', '7 AM','12 PM',15,150,'Room 1','Position 3',99,'Kevin') 
INSERT INTO @MyAssigneeTable VALUES (2265, '2013-10-24', '7 AM','12 PM',13,150,'Room 1','Position 1',99,'') 
INSERT INTO @MyAssigneeTable VALUES (2265, '2013-10-24', '7 AM','12 PM',14,150,'Room 1','Position 2',99,'Amber') 
INSERT INTO @MyAssigneeTable VALUES (2265, '2013-10-24', '7 AM','12 PM',15,150,'Room 1','Position 3',99,'Lawrence') 
INSERT INTO @MyAssigneeTable VALUES (2266, '2013-10-25', '7 AM','12 PM',13,150,'Room 1','Position 1',99,'Chad') 
INSERT INTO @MyAssigneeTable VALUES (2266, '2013-10-25', '7 AM','12 PM',14,150,'Room 1','Position 2',99,'Kevin') 
INSERT INTO @MyAssigneeTable VALUES (2266, '2013-10-25', '7 AM','12 PM',16,150,'Room 1','Position 3',99,'') 

Select * from @MyAssigneeTable 

소스 테이블을 재현하는 몇 가지 예제 코드입니다하지만 원하는 출력을 얻을 수 없습니다. 이 아래의 원하는 테이블 스크립트에서 필자는 고유 한 날짜, 위치 열 행을 별개의 값으로, 셀을 행 및 열을 할당 대상으로 교차하도록 열 이름을 필요로했습니다. 그러나 이것은 너무 복잡해서 알아낼 수 없습니다. 이것도 할 수 있습니까? 여기에 원하는 출력을 재 작성하는 DDL이 있습니다.

Declare @MyDesiredTable table (
          Position varchar(200), 
          [2013-10-23] varchar(100), 
          [2013-10-24] varchar(100), 
          [2013-10-25] varchar(100) 
         ) 

INSERT INTO @MyDesiredTable VALUES('Room 1/Position 1','','','Chad') 
INSERT INTO @MyDesiredTable VALUES('Room 1/Position 2','Matt','Amber','Kevin') 
INSERT INTO @MyDesiredTable VALUES('Room 1/Position 3','Kevin','Lawrence','') 

Select * from @MyDesiredTable 

아무도 도와 줄 수 있습니까?

도움을 주셔서 감사합니다.

+0

시도한 것을 보여줄 수 있습니까? – Siyual

+0

"Select * from @MyAssigneeTable"과 같은 스크립트를 사용하여 기본 PIVOT 테이블 예제 (예 : http://sqlhints.com/2014/03/10/pivot-and-unpivot-in-sql-server/)를 시도했습니다. PIVOT (할당 자 FOR VDate IN (@MyAssigneeTable에서 Distinct (VDate) 선택)) AS PVTTable "을 참조하십시오. 하지만 구문 오류가 발생합니다. 나는 이것이 올바른 접근법인지 전혀 모른다. 대부분의 예제는 PIVOT 절의 내부에 "AVG", "SUM"등을 수행하는 것으로 보입니다. 나는 내가 믿지 않는 집계 함수를 원하지 않는다. 그래서 생명선은 환상적 일 것입니다 !! 감사합니다 – Solo812

+0

피벗 테이블은 요약을 방지하기위한 도구입니다. 요약은 집계 함수의 사용에 달려 있습니다. – Smandoli

답변

1

dynamic sql을 사용하여 헤더 목록의 날짜 목록을 작성하고 MAX를 사용하여 특정 행의 담당자를 얻을 수 있습니다.

그냥 SQL Fiddle에서 원료 가격 인하를 붙여가는 :

검색어 1 :

DECLARE @sql AS NVARCHAR(MAX) 
DECLARE @cols AS NVARCHAR(MAX) 

SELECT @cols= ISNULL(@cols + ',','') + QUOTENAME(CAST(VDate AS date)) 
FROM (SELECT DISTINCT VDate FROM MyAssigneeTable) AS Dates 


SET @sql = N' 
    SELECT Position, ' + @cols + ' 
    FROM (
    SELECT 
     Position = RoomDesc + ''/'' + Position, 
     Vdate = CAST(vdate as date), 
     Assignee 
    FROM MyAssigneeTable 
) MyAssigneeTable 
    PIVOT(MAX(Assignee) 
    FOR MyAssigneeTable.vdate IN (' + @cols + ')) AS PivotTable;'; 

EXEC sp_executesql @sql 

Results :

|   POSITION | 2013-10-23 | 2013-10-24 | 2013-10-25 | 
|---------------------|------------|------------|------------| 
| Room 1/Position 1 |   |   |  Chad | 
| Room 1/Position 2 |  Matt |  Amber |  Kevin | 
| Room 1/Position 3 |  Kevin | Lawrence |   | 

MS SQL 서버 2008 스키마 설정 :

create table MyAssigneeTable 
(
    VDayID int, 
    VDate datetime, 
    StartTime varchar(100), 
    EndTime varchar(100), 
    PositionID int, 
    RoomID int, 
    RoomDesc varchar(100), 
    Position varchar(100), 
    SortOrder int, 
    Assignee varchar(100) 
) 

INSERT INTO MyAssigneeTable VALUES (2264, '2013-10-23', '7 AM','12 PM',13,150,'Room 1','Position 1',99,'') 
INSERT INTO MyAssigneeTable VALUES (2264, '2013-10-23', '7 AM','12 PM',14,150,'Room 1','Position 2',99,'Matt') 
INSERT INTO MyAssigneeTable VALUES (2264, '2013-10-23', '7 AM','12 PM',15,150,'Room 1','Position 3',99,'Kevin') 
INSERT INTO MyAssigneeTable VALUES (2265, '2013-10-24', '7 AM','12 PM',13,150,'Room 1','Position 1',99,'') 
INSERT INTO MyAssigneeTable VALUES (2265, '2013-10-24', '7 AM','12 PM',14,150,'Room 1','Position 2',99,'Amber') 
INSERT INTO MyAssigneeTable VALUES (2265, '2013-10-24', '7 AM','12 PM',15,150,'Room 1','Position 3',99,'Lawrence') 
INSERT INTO MyAssigneeTable VALUES (2266, '2013-10-25', '7 AM','12 PM',13,150,'Room 1','Position 1',99,'Chad') 
INSERT INTO MyAssigneeTable VALUES (2266, '2013-10-25', '7 AM','12 PM',14,150,'Room 1','Position 2',99,'Kevin') 
INSERT INTO MyAssigneeTable VALUES (2266, '2013-10-25', '7 AM','12 PM',16,150,'Room 1','Position 3',99,'') 
+1

정말 고마워요. 나는 그것을 테이블 변수를 위해 약간 변경해야했지만 당신의 도움없이 이것을 할 수 없었습니다! JPW 정말 고마워. – Solo812