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中创建了更多的数据,一切都很顺利。