2015-10-29 71 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