我有一个查询来计算一个表中的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因此这个列表从左到右相当大。如果我可以隐藏它们,它可以清理那个视图
答案 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)