如何对sql表中的列进行分组以进行计数

时间:2011-07-11 16:14:03

标签: sql sql-server-2005

我不确定这是否有一个简单的概念或模式,所以我只需要描述它。

假设我有一张这样的表:

CallID (uniqueidentifier)
CallDateTime (datetime)
CallIssue (varchar(100))
Pollution (bit)
Violation (bit)
Accident (bit)
General (bit)

我希望得到一份报告。对于30个不同的调用,计数将如下所示:

Pollution: 4
Violation: 3
Accident: 2
General: 7
Pollution & Violation: 5
Pollution & Accident: 9

如果呼叫同时设置了污染和违规,它们将被单独计算,而不是仅具有污染或违规的呼叫。

除了光标之外,还有什么方法可以做到这一点吗?

我们正在使用SQL 2005。

3 个答案:

答案 0 :(得分:1)

这样的事情可以为你计算。

select sum(case Pollution when 1 then 1 else 0 end) as Pollution,
       sum(case Violation when 1 then 1 else 0 end) as Violation,
       sum(case Accident when 1 then 1 else 0 end) as Accident,
       sum(case General when 1 then 1 else 0 end) as General,
       sum(case when Pollution = 1 and Violation = 1 then 1 else 0 end) [Pollution & Violation],
       sum(case when Pollution = 1 and Accident = 1 then 1 else 0 end) [Pollution & Accident]
from YourTable

答案 1 :(得分:0)

我不是SQL大师但不是我的头脑

SELECT 
    SUM(CASE WHEN Pollution= 1 THEN 1 ELSE 0 END) AS Pollution, 
    SUM(CASE WHEN Violation= 1 THEN 1 ELSE 0 END) AS Violation, 
    SUM(CASE WHEN Accident= 1 THEN 1 ELSE 0 END) AS Accident,
    SUM(CASE WHEN Pollution & Violation= 1 THEN 1 ELSE 0 END) AS [Pollution_And_Violation], 
    SUM(CASE WHEN Pollution & Accident= 1 THEN 1 ELSE 0 END) AS [Pollution_And_Accident], 
FROM
dbo.Table

编辑:

与Mikael相同,仅使用按位操作。

答案 2 :(得分:0)

简单地执行GROUP BY pollution, violation, accident, general应该按照您想要的方式为您提供汇总(您可以执行count(*))。然后,您可以读取分组列以确定您所指的汇总 请注意,如果您希望将其纳入某种显示程序,则无论如何都可能需要游标 - 但是,几乎在所有情况下,都应在数据库层中执行聚合和排序。

以下是一个示例查询:

SELECT pollution, violation, accident, general, count(*)
FROM callTable
GROUP BY pollution, violation, accident, general  

将显示设置为'污染&然后可以在应用程序代码中完成违规 - 通过测试相关位列是否设置为“1”或其他,并显示计数。