Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何对sql表中的列进行分组以进行计数_Sql_Sql Server 2005 - Fatal编程技术网

如何对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。