Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如果值为0,如何从视图中隐藏表_Sql_Sql Server 2008 - Fatal编程技术网

Sql 如果值为0,如何从视图中隐藏表

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' ,

我有一个从一个表中统计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'
 ,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来实现这一点,但是在实际显示数据的层上显示/隐藏列要容易得多。一个视图有固定数量的列,它不是动态的。你不能只隐藏一个完美。那正是我想要的。谢谢你,戈登