我不确定这是否有一个简单的概念或模式,所以我只需要描述它。
假设我有一张这样的表:
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。
答案 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”或其他,并显示计数。