2015-10-29 70 views
0

说我有一个表枢轴在SQL Server中的表

Name Dept  Shift Time Date  Section 
------- ----------- ------- ------- ----------- ------- 
GAN  BREAKER  Day  8-10 2015-10-27 NULL 
GAN  BREAKER  Day  10-12 2015-10-27 NULL 
GAN  BREAKER  Day  12-2 2015-10-27 Stone 
GAN  BREAKER  Day  2-4  2015-10-27 NULL 
GAN  BREAKER  Day  4-6  2015-10-27 NULL 
GAN  BREAKER  Day  6-8  2015-10-27 NULL 
GAN  BREAKER  Night 8-10 2015-10-27 NULL 
GAN  BREAKER  Night 10-12 2015-10-27 NULL 
GAN  BREAKER  Night 12-2 2015-10-27 NULL 
GAN  BREAKER  Night 2-4  2015-10-27 NULL 
GAN  BREAKER  Night 4-6  2015-10-27 Wall 
GAN  BREAKER  Night 6-8  2015-10-27 NULL 

以下摘录,我愿做旋转,使其看起来像这样:

      2015-10-27 
Name Dept  Shift 8-10 10-12 12-2 2-4  4-6  6-8 
------- ----------- ------- ------- ------- ------- ------- ------- ------ 
GAN  BREAKER  Day  NULL NULL Stone NULL NULL NULL 
GAN  BREAKER  Night NULL NULL NULL NULL Wall NULL 

或者也可以是接近上述建议的关键点。

它可以在SQL Server中完成吗?有人可以指出我对此的正确查询吗?

非常感谢您的关注! :)

回答

2

公平地说,这是一个有点懒惰。我以前从未使用SQL Server,也没有听说过PIVOT。在5分钟内,我已经学会了足够的知识让你接手。下次再做一些研究。

是的,Google表示SQL Server具有PIVOT函数。所以......

SELECT * FROM Table1 
PIVOT(
    MIN([section]) 
    FOR [time] 
    IN ([8-10],[10-12],[12-2],[4-6],[6-8]) 
) AS shiftTimes 

OUTPUT:

Name | Dept  | Shift | Date   | 8-10 | 10-12 | 12-2 | 4-6 | 6-8 
---------------------------------------------------------------------------------------- 
GAN | BREAKER | Day  | 2015-10-27 | (null) | (null) | Stone | (null) | (null) 
GAN | BREAKER | Night | 2015-10-27 | (null) | (null) | (null) | Wall | (null) 

DEMO

...非常,非常接近你想要的输出。也许有一些调整和一些研究,你可以找到你的完美输出。我可以用另一个5完成它,但我会留给你的。

在这里,我假设你的换挡模式(8-10)将永远是相同的,所以我手动输入它们。如果他们未来可能改变,我肯定会考虑使用像Paul的答案那样的动态支点。

与我的答案相比,他的差异在于维护和性能。根据您给我们提供的小数据集,我的查询很容易读取,运行时间为0.38毫秒,相比之下他的0.5毫秒。但是,这不是关于这一点,而是关于是否需要动态创建新列。如果你不这样做,请使用我的。如果你这样做,用他的。

享受。

+2

嗨PaparazzoKid。感谢您的关注。非常感谢。下次会做,并付出更多的努力。 – Khairul

1

尝试动态透视,

CREATE TABLE #Your_Table 
(
    NAME VARCHAR(10), 
    DEPT VARCHAR(20), 
    [SHIFT] VARCHAR(10), 
    [TIME] VARCHAR(50), 
    [DATE] DATE, 
    SECTION VARCHAR(50) 
) 

INSERT INTO #Your_Table 
VALUES  ('GAN','BREAKER','Day','8-10','2015-10-27',NULL), 
      ('GAN','BREAKER','Day','10-12','2015-10-27',NULL), 
      ('GAN','BREAKER','Day','12-2','2015-10-27','Stone'), 
      ('GAN','BREAKER','Day','2-4','2015-10-27',NULL), 
      ('GAN','BREAKER','Day','4-6','2015-10-27',NULL), 
      ('GAN','BREAKER','Day','6-8','2015-10-27',NULL), 
      ('GAN','BREAKER','Night','8-10','2015-10-27',NULL), 
      ('GAN','BREAKER','Night','10-12','2015-10-27',NULL), 
      ('GAN','BREAKER','Night','12-2','2015-10-27',NULL), 
      ('GAN','BREAKER','Night','2-4','2015-10-27',NULL), 
      ('GAN','BREAKER','Night','4-6','2015-10-27','Wall'), 
      ('GAN','BREAKER','Night','6-8','2015-10-27',NULL) 

DECLARE @DynamicPivotQuery AS NVARCHAR(MAX) 
DECLARE @ColumnName AS NVARCHAR(MAX) 

--Get distinct values of the PIVOT Column 
SELECT @ColumnName = ISNULL(@ColumnName + ',', '') 
        + Quotename([TIME]) 
FROM (SELECT DISTINCT [TIME] 
     FROM #Your_Table) AS Courses 
--Prepare the PIVOT query using the dynamic 
SET @DynamicPivotQuery = N'SELECT Name, Dept,[Shift], ' 
         + @ColumnName + 'FROM #Your_Table PIVOT(MAX(SECTION) FOR [TIME] 
      IN ('+ @ColumnName + ')) AS PVTTable' 

--Execute the Dynamic Pivot Query 
EXEC SP_EXECUTESQL 
    @DynamicPivotQuery 

SQLFIDDLE DEMO

+0

我已经为你添加了一个可用的SQLFiddle演示。我已经有一个打开这个数据集:) – TheCarver

+0

嗨保罗。谢谢你的建议:)这也可以 – Khairul