如何编写SQL查询以获取不同对象的计数

如何编写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 试试这个

有一个表“OBJECTS”,其中一列“OBJECT_NAME”,有三个值OBJ1、OBJ2、OBJ3。 表对象的快照是:

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,您将无法获得根据列中的值返回可变列数的查询。