Sql 如果值为0,如何从视图中隐藏表
我有一个从一个表中统计msg类型的查询。在任何给定的时间,根据数据库中正在进行的事务,可能会有十几个显示任何结果。我希望能够仅显示值大于0的任何MSG_TYPE_ID的计数 示例查询:Sql 如果值为0,如何从视图中隐藏表,sql,sql-server-2008,Sql,Sql Server 2008,我有一个从一个表中统计msg类型的查询。在任何给定的时间,根据数据库中正在进行的事务,可能会有十几个显示任何结果。我希望能够仅显示值大于0的任何MSG_TYPE_ID的计数 示例查询: SELECT COUNT (CASE WHEN MSG_TYPE_ID = '0' THEN 1 ELSE NULL END) AS 'Type 0' ,COUNT (CASE WHEN MSG_TYPE_ID = '1' THEN 1 ELSE NULL END) AS 'Type 1' ,
SELECT
COUNT (CASE WHEN MSG_TYPE_ID = '0' THEN 1 ELSE NULL END) AS 'Type 0'
,COUNT (CASE WHEN MSG_TYPE_ID = '1' THEN 1 ELSE NULL END) AS 'Type 1'
,COUNT (CASE WHEN MSG_TYPE_ID = '2' THEN 1 ELSE NULL END) AS 'Type 2'
,COUNT (CASE WHEN MSG_TYPE_ID = '3' THEN 1 ELSE NULL END) AS 'Type 3'
,COUNT (CASE WHEN MSG_TYPE_ID = '5' THEN 1 ELSE NULL END) AS 'Type 5'
FROM DB1 WITH (NOLOCK)
预期产量
Type 0 Type 1 Type 2 Type 3 Type 5
67 0 0 47 56
如何从显示“0”的显示中隐藏任何msg_类型列?大约有85个msg_type_id,所以这个列表从左到右相当大。如果我可以隐藏它们,它就可以清理视图,因为SQL查询有固定数量的列。您可以使用动态SQL获得所需的内容。但更简单的解决方案是将值放在单独的行上:
SELECT MSG_TYPE_ID, COUNT(*)
FROM DB1 WITH (NOLOCK)
WHERE MSG_TYPE_ID IN ('0', '1', '2', '3', '5')
GROUP BY MSG_TYPE_ID;
这将只在记录存在的地方输出值。如果您想要可变的列数,可以使用游标,但会有些麻烦。 解析行,将查询保存在字符串中,然后执行字符串
declare @id int
declare @msg_type varchar(100)
declare @query varchar(100)
set @query=''
DECLARE mycursor CURSOR FOR
SELECT MSG_TYPE_ID, COUNT(*)
FROM table WITH (NOLOCK)
GROUP BY MSG_TYPE_ID
Having count(*) >o
OPEN mycursor
FETCH NEXT FROM mycursor
INTO @msg_type, @id
WHILE @@FETCH_STATUS = 0
BEGIN
if @query <> ''
begin
set @query = @query + ', '
end
set @query = @query + cast(@id as varchar) + ' as ' + @msg_type
FETCH NEXT FROM mycursor
INTO @msg_type, @id
END
CLOSE mycursor;
DEALLOCATE mycursor;
set @query = 'select ' + @query
print @query
EXECUTE (@query)
declare@id int
声明@msg_类型varchar(100)
声明@query varchar(100)
设置@query=''
将mycursor声明为
选择消息类型ID,计数(*)
从带有(NOLOCK)的表开始
按消息类型\u ID分组
有计数(*)>o的
打开我的光标
从mycursor获取下一个
进入@msg_类型,@id
而@@FETCH\u STATUS=0
开始
如果@query“”
开始
设置@query=@query+,'
终止
设置@query=@query+cast(@id作为varchar)+“作为”+@msg\u类型
从mycursor获取下一个
进入@msg_类型,@id
终止
关闭我的光标;
释放我的游标;
set@query='选择'+@query
打印@query
执行(@query)
您可以在演示层中执行此操作。SQL Server将查询及其结果集视为协定。您可以使用非常难看的嵌套动态SQL来实现这一点,但是在实际显示数据的层上显示/隐藏列要容易得多。一个视图有固定数量的列,它不是动态的。你不能只隐藏一个完美。那正是我想要的。谢谢你,戈登