Sql 整平一张桌子

Sql 整平一张桌子,sql,Sql,我正在寻找一个非常基本的平坦。我在数据库中有一个表,为不同行中的员工提供每个字段 EX EMPLOYEE GROUP_NAME 81 BNEEO55 81 BNELLIG 81 LPKAPE 81 HRFT 90 BNRETINV .... 我想创建一个视图,将数据报告为: EMPLOYEE

我正在寻找一个非常基本的平坦。我在数据库中有一个表,为不同行中的员工提供每个字段

EX 
  EMPLOYEE         GROUP_NAME
   81               BNEEO55
   81               BNELLIG
   81               LPKAPE
   81               HRFT
   90               BNRETINV
  ....
我想创建一个视图,将数据报告为:

EMPLOYEE     Group1      Group2        Group3         Group4         Group5
81           BNEEO55     BNELLIG       LPKAPE         HRFT           NULL
90           NULL        NULL          NULL           NULL           BNRETINV


您需要透视数据,如果您使用的是SQL Server 2008或更高版本,则可以使用透视功能:

CREATE TABLE #T (Employee INT, Group_name VARCHAR(50))
INSERT #T VALUES (81, 'BNEEO55'), (81, 'BNELLIG'), (81, 'LPKAPE'), (81, 'HRFT'), (90, 'BNRETINV')

SELECT  Employee, 
        COALESCE([BNEEO55],'No') AS [BNEEO55],
        COALESCE([BNELLIG],'No') AS [BNELLIG],
        COALESCE([BNRETINV],'No') AS [BNRETINV],
        COALESCE([HRFT],'No') AS [HRFT],
        COALESCE([LPKAPE],'No') AS [LPKAPE]
FROM    (   SELECT  *, 'Yes' [Data]
            FROM    #T
        ) d
        PIVOT
        (   MAX(Data)
            FOR Group_Name IN ([BNEEO55], [BNELLIG], [BNRETINV], [HRFT], [LPKAPE])
        ) pvt
但听起来,如果您的数据正在更改,您需要动态地执行此操作。类似于以下内容的操作将起作用:

DECLARE @SQL NVARCHAR(MAX) = '',
        @Cols NVARCHAR(MAX) = ''

SELECT  @SQL = @SQL + ',' + QUOTENAME(Group_Name),
        @Cols = @Cols + ',COALESCE(' + QUOTENAME(Group_Name) + ',''No'') AS ' + QUOTENAME(Group_Name)
FROM    (   SELECT  DISTINCT Group_Name 
            FROM    #T
        ) T

SET @SQL = '
            SELECT  Employee, ' + STUFF(@Cols, 1, 1, '') + 
            'FROM   (   SELECT  *, ''Yes'' [Data]
                        FROM    #T
                    ) d
                    PIVOT
                    (   MAX(Data)
                        FOR Group_Name IN (' + STUFF(@SQL, 1, 1, '') + ')
                    ) pvt'

EXECUTE SP_EXECUTESQL @SQL
这将建立与第一个查询相同的查询,但意味着添加新组名时不必更改查询

编辑

要创建并将其作为存储过程调用,请执行以下操作:

CREATE TABLE T (Employee INT, Group_name VARCHAR(50))
INSERT T VALUES (81, 'BNEEO55'), (81, 'BNELLIG'), (81, 'LPKAPE'), (81, 'HRFT'), (90, 'BNRETINV')
GO
CREATE PROCEDURE PivotT
AS

DECLARE @SQL NVARCHAR(MAX) = '',
        @Cols NVARCHAR(MAX) = ''

SELECT  @SQL = @SQL + ',' + QUOTENAME(Group_Name),
        @Cols = @Cols + ',COALESCE(' + QUOTENAME(Group_Name) + ',''No'') AS ' + QUOTENAME(Group_Name)
FROM    (   SELECT  DISTINCT Group_Name 
            FROM    T
        ) T

SET @SQL = '
            SELECT  Employee, ' + STUFF(@Cols, 1, 1, '') + 
            'FROM   (   SELECT  *, ''Yes'' [Data]
                        FROM    T
                    ) d
                    PIVOT
                    (   MAX(Data)
                        FOR Group_Name IN (' + STUFF(@SQL, 1, 1, '') + ')
                    ) pvt'

EXECUTE SP_EXECUTESQL @SQL
GO
EXECUTE PivotT

您需要透视数据,如果您使用的是SQL Server 2008或更高版本,则可以使用透视功能:

CREATE TABLE #T (Employee INT, Group_name VARCHAR(50))
INSERT #T VALUES (81, 'BNEEO55'), (81, 'BNELLIG'), (81, 'LPKAPE'), (81, 'HRFT'), (90, 'BNRETINV')

SELECT  Employee, 
        COALESCE([BNEEO55],'No') AS [BNEEO55],
        COALESCE([BNELLIG],'No') AS [BNELLIG],
        COALESCE([BNRETINV],'No') AS [BNRETINV],
        COALESCE([HRFT],'No') AS [HRFT],
        COALESCE([LPKAPE],'No') AS [LPKAPE]
FROM    (   SELECT  *, 'Yes' [Data]
            FROM    #T
        ) d
        PIVOT
        (   MAX(Data)
            FOR Group_Name IN ([BNEEO55], [BNELLIG], [BNRETINV], [HRFT], [LPKAPE])
        ) pvt
但听起来,如果您的数据正在更改,您需要动态地执行此操作。类似于以下内容的操作将起作用:

DECLARE @SQL NVARCHAR(MAX) = '',
        @Cols NVARCHAR(MAX) = ''

SELECT  @SQL = @SQL + ',' + QUOTENAME(Group_Name),
        @Cols = @Cols + ',COALESCE(' + QUOTENAME(Group_Name) + ',''No'') AS ' + QUOTENAME(Group_Name)
FROM    (   SELECT  DISTINCT Group_Name 
            FROM    #T
        ) T

SET @SQL = '
            SELECT  Employee, ' + STUFF(@Cols, 1, 1, '') + 
            'FROM   (   SELECT  *, ''Yes'' [Data]
                        FROM    #T
                    ) d
                    PIVOT
                    (   MAX(Data)
                        FOR Group_Name IN (' + STUFF(@SQL, 1, 1, '') + ')
                    ) pvt'

EXECUTE SP_EXECUTESQL @SQL
这将建立与第一个查询相同的查询,但意味着添加新组名时不必更改查询

编辑

要创建并将其作为存储过程调用,请执行以下操作:

CREATE TABLE T (Employee INT, Group_name VARCHAR(50))
INSERT T VALUES (81, 'BNEEO55'), (81, 'BNELLIG'), (81, 'LPKAPE'), (81, 'HRFT'), (90, 'BNRETINV')
GO
CREATE PROCEDURE PivotT
AS

DECLARE @SQL NVARCHAR(MAX) = '',
        @Cols NVARCHAR(MAX) = ''

SELECT  @SQL = @SQL + ',' + QUOTENAME(Group_Name),
        @Cols = @Cols + ',COALESCE(' + QUOTENAME(Group_Name) + ',''No'') AS ' + QUOTENAME(Group_Name)
FROM    (   SELECT  DISTINCT Group_Name 
            FROM    T
        ) T

SET @SQL = '
            SELECT  Employee, ' + STUFF(@Cols, 1, 1, '') + 
            'FROM   (   SELECT  *, ''Yes'' [Data]
                        FROM    T
                    ) d
                    PIVOT
                    (   MAX(Data)
                        FOR Group_Name IN (' + STUFF(@SQL, 1, 1, '') + ')
                    ) pvt'

EXECUTE SP_EXECUTESQL @SQL
GO
EXECUTE PivotT


什么类型的数据库?还有,你想做什么?还有,你所说的“平坦”是什么意思?我用很好的间距将这些都显示为图表,但这似乎没有实现。对不起,我是新来的。如果有人可以编辑TIAI,我将使用MS SQL Server。该表在同一列中列出了员工编号和一条数据。这导致每个员工大约有20行数据。我想把它平放成一排。有20多列。原始列中每种类型的数据对应一列。没关系,莱西:。你打算用什么语言实现你的视图?如果你问我,制作最后一个数据透视表是一个演示细节,它与你的数据库或任何查询无关。从数据库中检索标准化数据并将其传递给表示层,表示层处理以所需格式显示的数据。什么类型的数据库?还有,你想做什么?还有,你所说的“平坦”是什么意思?我用很好的间距将这些都显示为图表,但这似乎没有实现。对不起,我是新来的。如果有人可以编辑TIAI,我将使用MS SQL Server。该表在同一列中列出了员工编号和一条数据。这导致每个员工大约有20行数据。我想把它平放成一排。有20多列。原始列中每种类型的数据对应一列。没关系,莱西:。你打算用什么语言实现你的视图?如果你问我,制作最后一个数据透视表是一个演示细节,它与你的数据库或任何查询无关。您可以从数据库中检索标准化数据,并将其传递给表示层,表示层将处理以您需要的任何格式显示的数据。不过,我还没有完全理解。我以前没有创建存储过程。我假设我需要在某个地方添加原始表名,所以我添加了T,并收到了它无法找到存储过程的错误。另外,我要将其指向何处以填充视图?谢谢。您使用的是什么版本的SQL Server?您不能以视图的形式执行此操作,它必须是一个存储过程。我已经编辑了我的答案,以展示如何创建过程并调用它。也值得在MSDN上读一读关于。如果你能把你的模式发布在网站上,我可以尝试创建一个更适合你需要的例子。我看到了PivotT的创建位置,但没有看到SP_EXECUTESQL的创建位置。我收到消息说它找不到存储过程SP_EXECUTESQL。我在SQL Fiddle中创建了更多的数据,并且工作得非常好。是的,动态是我需要的方式。不过,我还没有完全理解。我以前没有创建存储过程。我假设我需要在某个地方添加原始表名,所以我添加了T,并收到了它无法找到存储过程的错误。另外,我要将其指向何处以填充视图?谢谢。您使用的是什么版本的SQL Server?您不能以视图的形式执行此操作,它必须是一个存储过程。我已经编辑了我的答案,以展示如何创建过程并调用它。也值得在MSDN上读一读关于。如果你能把你的模式发布在网站上,我可以尝试创建一个更适合你需要的例子。我看到了PivotT的创建位置,但没有看到SP_EXECUTESQL的创建位置。我收到一条消息,它找不到存储过程SP_EXECUTESQL。我在SQL FIDLE中创建了更多的数据,一切都很顺利。