如何编写SQL查询以获取不同对象的计数
有一个表“OBJECTS”,其中一列“OBJECT_NAME”,有三个值OBJ1、OBJ2、OBJ3。 表对象的快照是:如何编写SQL查询以获取不同对象的计数,sql,Sql,有一个表“OBJECTS”,其中一列“OBJECT_NAME”,有三个值OBJ1、OBJ2、OBJ3。 表对象的快照是: OBJECT_NAME ---------- OBJ3 OBJ1 OBJ2 OBJ1 OBJ1 OBJ2 如何编写一个高效的SQL查询,以如下所示的格式输出不同对象的计数 OBJ1_Count OBJ2_COUNT OBJ3_COUNT --------------------------------- 3 2 1 试试这个
OBJECT_NAME
----------
OBJ3
OBJ1
OBJ2
OBJ1
OBJ1
OBJ2
如何编写一个高效的SQL查询,以如下所示的格式输出不同对象的计数
OBJ1_Count OBJ2_COUNT OBJ3_COUNT
---------------------------------
3 2 1
试试这个:
select
sum(case when [object_name] = 'OBJ1' then 1 else 0 end) as obj1_count,
sum(case when [object_name] = 'OBJ2' then 1 else 0 end) as obj2_count,
sum(case when [object_name] = 'OBJ3' then 1 else 0 end) as obj3_count
from
[objects]
在对象名称上建立索引肯定是有益的您可以使用轴:
SELECT * FROM [OBJECTS]
PIVOT (COUNT([OBJECT_NAME])
FOR [OBJECT_NAME] IN ([OBJ1],[OBJ2],[OBJ3])) AS [OBJCount]
如果不想硬编码列名,可以使用动态sql获取它们
DECLARE @cols AS NVARCHAR(MAX)
, @query AS NVARCHAR(MAX)
SET @cols = STUFF((SELECT DISTINCT
',' + QUOTENAME(o.[OBJECT_NAME])
FROM [OBJECTS] o
FOR XML PATH('')
, TYPE
).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
SET @query = 'SELECT * FROM [OBJECTS]
PIVOT (COUNT([OBJECT_NAME])
FOR [OBJECT_NAME] IN (' + @cols + ')) AS [OBJCount]'
EXECUTE(@query)
感谢回复。我需要行值必须作为列值出现在DYNMICALLYTANKS中才能回复。我需要行值必须作为列值出现在DYNMICALLYDYNAMICALL中?也许你应该在问题中具体说明这一点——这是一个值得错过的重要注意事项。您必须考虑使用
透视图
——即使这样,您也必须有固定数量的列。如果没有动态SQL,您将无法获得根据列中的值返回可变列数的查询。