在 SQL 服务器中旋转 table
Pivoting a table in SQL Server
假设我有以下 table
的摘录
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服务器中完成吗?有人可以指出正确的查询吗?
谢谢大家的关注! :)
公平地说,这有点懒惰。我以前从未使用过 SQL 服务器,也从未听说过 PIVOT
。在 5 分钟内,我学到了足够多的东西可以传授给你,让你接手。下次再研究一下。
是的,Google说SQL服务器有PIVOT
功能。所以...
SELECT * FROM Table1
PIVOT(
MIN([section])
FOR [time]
IN ([8-10],[10-12],[12-2],[4-6],[6-8])
) AS shiftTimes
输出:
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)
...非常非常接近您想要的输出。也许通过一些调整和研究,您可以找到完美的输出。我可能可以再用 5 个来完成它,但我会把它留给你。
这里我假设您的轮班模式 (8-10) 将始终相同,因此我手动输入了它们。如果他们将来可能会改变,我肯定会考虑使用像保罗的回答那样的动态枢轴。
他的答案与我的不同之处在于易于维护和性能。根据您提供给我们的微型数据集,我的查询易于阅读,运行时间为 0.38 毫秒,而他的查询时间为 0.5 毫秒。但是,这与此无关,而与您是否需要动态创建新列有关。如果你不这样做,用我的。如果这样做,请使用他的。
尽情享受吧。
尝试动态透视,
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
假设我有以下 table
的摘录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服务器中完成吗?有人可以指出正确的查询吗?
谢谢大家的关注! :)
公平地说,这有点懒惰。我以前从未使用过 SQL 服务器,也从未听说过 PIVOT
。在 5 分钟内,我学到了足够多的东西可以传授给你,让你接手。下次再研究一下。
是的,Google说SQL服务器有PIVOT
功能。所以...
SELECT * FROM Table1
PIVOT(
MIN([section])
FOR [time]
IN ([8-10],[10-12],[12-2],[4-6],[6-8])
) AS shiftTimes
输出:
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)
...非常非常接近您想要的输出。也许通过一些调整和研究,您可以找到完美的输出。我可能可以再用 5 个来完成它,但我会把它留给你。
这里我假设您的轮班模式 (8-10) 将始终相同,因此我手动输入了它们。如果他们将来可能会改变,我肯定会考虑使用像保罗的回答那样的动态枢轴。
他的答案与我的不同之处在于易于维护和性能。根据您提供给我们的微型数据集,我的查询易于阅读,运行时间为 0.38 毫秒,而他的查询时间为 0.5 毫秒。但是,这与此无关,而与您是否需要动态创建新列有关。如果你不这样做,用我的。如果这样做,请使用他的。
尽情享受吧。
尝试动态透视,
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