2014-10-02 85 views
1

我有一些严重的麻烦,在TSQL得到这个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 

我觉得我想要做某种PIVOT的,但我不能得到所需的输出。在下面所需的表格脚本中,我需要从不同日期驱动列名,将位置列行作为不同的值,并将行和列相交的单元格作为受让人。但是这对我来说太复杂了。这甚至可以完成?这是一个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 2014-10-02 16:24:06

+0

我曾尝试使用脚本喜欢做基本的数据透视表的例子(如http://sqlhints.com/2014/03/10/pivot-and-unpivot-in-sql-server/)“SELECT * FROM @MyAssigneeTable PIVOT (VDate IN的受让人(从@MyAssigneeTable中选择Distinct(VDate)))AS PVTTable“。但是我收到语法错误。我不知道这是否是正确的方法。大多数例子似乎都在PIVOT子句中使用“AVG”,“SUM”等。我不想要一个我不相信的聚合函数。所以一条生命线会是太棒了!谢谢 – Solo812 2014-10-02 16:32:04

+0

数据透视表是一种防止汇总的工具。总结取决于使用聚合函数。 – Smandoli 2014-10-02 16:52:41

回答

1

您可以使用动态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 Server 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

非常感谢。我不得不为table变量稍微修改一下,但如果没有你的帮助,不可能做到这一点!非常感谢你JPW。 – Solo812 2014-10-02 18:29:37