Sql server 在SQL Server中透视表

Sql server 在SQL Server中透视表,sql-server,sql-server-2012,pivot,pivot-table,Sql Server,Sql Server 2012,Pivot,Pivot 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

假设我有下面一张表格的摘录

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中完成吗?有人能给我指出正确的问题吗


谢谢你们的关注,伙计们!:)

公平地说,这有点懒。我以前从未使用过SQL Server,也没有听说过
PIVOT
。在5分钟内,我学到了足够的东西,可以传给你让你接手。下次再做些调查

是的,谷歌说SQL Server具有
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.38ms,而他的查询速度为0.5ms,这是基于您提供给我们的小数据集。但是,问题不在于此,而在于是否需要动态创建新列。如果你没有,用我的。如果你这样做了,就用他的


享受。

公平地说,这有点懒惰。我以前从未使用过SQL Server,也没有听说过
PIVOT
。在5分钟内,我学到了足够的东西,可以传给你让你接手。下次再做些调查

是的,谷歌说SQL Server具有
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.38ms,而他的查询速度为0.5ms,这是基于您提供给我们的小数据集。但是,问题不在于此,而在于是否需要动态创建新列。如果你没有,用我的。如果你这样做了,就用他的


享受。

公平地说,这有点懒惰。我以前从未使用过SQL Server,也没有听说过
PIVOT
。在5分钟内,我学到了足够的东西,可以传给你让你接手。下次再做些调查

是的,谷歌说SQL Server具有
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.38ms,而他的查询速度为0.5ms,这是基于您提供给我们的小数据集。但是,问题不在于此,而在于是否需要动态创建新列。如果你没有,用我的。如果你这样做了,就用他的


享受。

公平地说,这有点懒惰。我以前从未使用过SQL Server,也没有听说过
PIVOT
。在5分钟内,我学到了足够的东西,可以传给你让你接手。下次再做些调查

是的,谷歌说SQL Server具有
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.38ms,而他的查询速度为0.5ms,这是基于您提供给我们的小数据集。但是,问题不在于此,而在于是否需要动态创建新列。如果你没有,用我的。如果你这样做了,就用他的

享受。

试试动态枢轴

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 
试试动态枢轴

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 
试试动态枢轴

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 
试试动态枢轴

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演示。我已经用这个数据集打开了一个:)嗨,保罗。谢谢你的建议:)这很有效,我已经为你添加了一个工作的SQLFiddle演示。我已经用这个数据集打开了一个:)嗨,保罗。谢谢你的建议:)这很有效,我已经为你添加了一个工作的SQLFiddle演示。我已经用这个数据集打开了一个:)嗨,保罗。谢谢你的建议:)这很有效,我已经为你添加了一个工作的SQLFiddle演示。我已经用这个数据集打开了一个:)嗨,保罗。谢谢你的建议:)这对狗仔队来说很有效。谢谢你的关心。非常感谢。下一次我会更努力的。嗨,狗仔队。谢谢你的关心。非常感谢。下一次我会更努力的。嗨,狗仔队。谢谢你的关心。非常感谢。下一次我会更努力的。嗨,狗仔队。Tha