如何对sql表中的列进行分组以进行计数
我不确定是否有一个简单的概念或模式可以做到这一点,所以我只需要描述一下 假设我有一张这样的桌子:如何对sql表中的列进行分组以进行计数,sql,sql-server-2005,Sql,Sql Server 2005,我不确定是否有一个简单的概念或模式可以做到这一点,所以我只需要描述一下 假设我有一张这样的桌子: CallID (uniqueidentifier) CallDateTime (datetime) CallIssue (varchar(100)) Pollution (bit) Violation (bit) Accident (bit) General (bit) Pollution: 4 Violation: 3 Accident: 2 General: 7 Pollution &
CallID (uniqueidentifier)
CallDateTime (datetime)
CallIssue (varchar(100))
Pollution (bit)
Violation (bit)
Accident (bit)
General (bit)
Pollution: 4
Violation: 3
Accident: 2
General: 7
Pollution & Violation: 5
Pollution & Accident: 9
我想得到一份报告。对于30个不同的呼叫,计数如下所示:
CallID (uniqueidentifier)
CallDateTime (datetime)
CallIssue (varchar(100))
Pollution (bit)
Violation (bit)
Accident (bit)
General (bit)
Pollution: 4
Violation: 3
Accident: 2
General: 7
Pollution & Violation: 5
Pollution & Accident: 9
将要发生的是,如果一个呼叫同时设置了污染和违规,那么它们将被单独计算,而不是只设置了污染或违规的呼叫
除了光标,还有其他方法可以做到这一点吗
我们使用的是SQL 2005。类似的东西可以帮您计算
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
我不是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相同,只使用逐位运算。只需按污染、违规、事故、一般情况进行
分组就可以按您想要的方式进行汇总(您可以进行计数(*)
)。然后,您可以阅读分组列,以确定所指的汇总。
请注意,如果您希望将其放入某种显示程序中,则在任何情况下都可能需要光标-但是,在几乎所有情况下,聚合和排序都应在数据库层中执行
下面是一个查询示例:
SELECT pollution, violation, accident, general, count(*)
FROM callTable
GROUP BY pollution, violation, accident, general
然后,在应用程序代码中,通过测试相关位列是否设置为“1”或其他设置,并显示计数,可以执行诸如将显示设置为“污染和违规”之类的操作。只是为了澄清,没有污染和违规列。我可以用这个,但我必须这样做:SUM(当污染=1,违规=1,然后1,否则0结束)作为[污染和违规],SUM(当污染=1,违规=0,然后1,否则0结束)作为[污染],SUM(当污染=0,违规=1,然后1,否则0结束)作为[违规]我知道没有“污染和违规”专栏。这只是对“污染”和“违规”列执行逐位操作,因为您处理的是位。如果两列都为true,则语句返回1,否则返回0。与Mikael的解决方案相同,只是利用了您拥有比特的事实。你可以自己测试一下。只需运行一个查询,执行SELECT COUNT(*),其中污染和事故=1。