如果Value = 0,如何从视图中隐藏表

时间:2014-03-26 19:07:14

标签: sql sql-server-2008

我有一个查询来计算一个表中的msg类型。在任何给定的时间,可能会有十几个显示任何结果,具体取决于数据库中正在进行的事务。我希望能够仅为任何值为>的MSG_TYPE_ID显示COUNT个数量。 0

示例查询:

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_type列。 ?大约有85个msg_type_id' s因此这个列表从左到右相当大。如果我可以隐藏它们,它可以清理那个视图

2 个答案:

答案 0 :(得分:0)

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;

这只会输出记录存在的值。

答案 1 :(得分:0)

如果你想要一个可变数量的列,你可以使用光标,但有些难看。 解析行,在字符串中保存查询并执行字符串

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)