具有动态列数的SQL视图

时间:2014-02-24 14:30:16

标签: sql sql-server sql-view sql-function

我知道这是不可能直接的,但也许在sql函数的帮助下,可以创建具有动态列数的视图?我到底想要做的是 - 创建视图,其中列将是用户名(第一个表的值),日期(第二个表的值),以及属性的多个列(每个第三个表的行将是列)。用户表结构 - ID和用户名,日期表结构 - ID和日期时间,属性表结构 - ID,属性名称,属性值,fk用户ID(加上一个表关联表)。 结果应该类似于(列):

|用户名|日期| property 1 | .... | property n |

任何人都可以展示任何简单的样品吗?

2 个答案:

答案 0 :(得分:2)

在标准SQL中,,在我熟悉的任何SQL版本(SQL Server,Oracle,MySql,Access SQL)中也是如此。 SQL中的表,表达式和视图按设计具有固定列集。因此,它故意以这种方式受到限制。 AFAIK,在大多数SQL版本中,存储过程是唯一可以返回变量列集的对象。

答案 1 :(得分:0)

我对您的数据架构做了一些假设,但看起来您正在尝试生成类似这样的内容

CREATE VIEW User_Properties AS
SELECT 
[username], [date]
,MAX(CASE WHEN [PropertyName] = 'property 1' THEN [PropertyValue]  ELSE NULL END) AS [property 1]
,MAX(CASE WHEN [PropertyName] = 'property 2' THEN [PropertyValue]  ELSE NULL END) AS [property 2]
,MAX(CASE WHEN [PropertyName] = 'property 3' THEN [PropertyValue]  ELSE NULL END) AS [property 3]
....
,MAX(CASE WHEN [PropertyName] = 'property n' THEN [PropertyValue]  ELSE NULL END) AS [property n]
GROUP BY [username], [date]

可以按照

的方式自动化
--Cursor to return the list of Properties
DECLARE PROPERTY_CURSOR CURSOR FOR SELECT PropertyName From UserPropertyTable

DECLARE @PropertyName nvarchar(255)
DECLARE @SQL nvarchar(max)

--Start Building the view definition
SET @SQL ='CREATE VIEW User_Properties AS
SELECT [username], [date]'

--Add a column for each Property
OPEN PROPERTY_CURSOR 
FETCH NEXT FROM PROPERTY_CURSOR INTO @PropertyName
WHILE @@FETCH_STATUS =0
BEGIN
SET @SQL = ',MAX(CASE WHEN [PropertyName] = '+QUOTENAME(@PropertyName,'''')+' THEN [PropertyValue]  ELSE NULL END) AS '+QUOTENAME(@PropertyName)
FETCH NEXT FROM PROPERTY_CURSOR INTO @PropertyName
END
DEALLOCATE PROPERTY_CURSOR 


--Finish off the Create_View SQL 
SET @SQL =@SQL +'
FROM UserPropertyTable
GROUP BY [username], [date]'

--Execute the Create_View SQL 
EXEC (@SQL)