0

我有一个名为“出席”的表,如下所示:

Sno  SecurityGroup  SecurityName  Designation   AttendanceStatus
----------------------------------------------------------------
1    JJ             Ram           officer       present
2    JJ             Raja          Guards        Present
3    JJ             Rani          LadyGuards    Present
4    JJ             Ramu          officer       present

我需要输出作为每个指定中存在的证券数量的计数,如下所示:

SecutityGroup Officer  Guards  LadyGuards
-----------------------------------------
JJ              2        1         1

有人可以帮我写一个查询来获得这个输出吗?

4

5 回答 5

7
select SecurityGroup,
    sum(case when Designation = 'officer' then 1 end) as Officer,
    sum(case when Designation = 'Guards' then 1 end) as Guards,
    sum(case when Designation = 'LadyGuards' then 1 end) as LadyGuards 
from Attendance
group by SecurityGroup

或者,如果您可以将信息放在行中,您可以执行以下操作:

select SecurityGroup, Designation, count(*) as Count
from Attendance
group by SecurityGroup, Designation 

显然,第二种方法是首选,因为它不那么脆弱,并且如果Designations在没有任何修改的情况下添加更多内容,它将起作用。

于 2012-06-07T14:01:40.853 回答
2

这也可以通过 PIVOT 来完成,具体取决于您的数据库:

SELECT SecurityGroup, SUM([officer]) AS Officers, SUM([Guards]) AS Guards, SUM([LadyGuards]) AS LadyGuards
FROM Attendance
PIVOT
    (
        COUNT(Sno)
        FOR Designation IN ([officer], [Guards], [LadyGuards])
    ) as pvt
WHERE AttendanceStatus = 'Present'
GROUP BY SecurityGroup

如果您希望根据表中的任何内容动态生成列列表,这会变得更加困难,但这避免了对大量子查询的需求。

于 2012-06-07T14:38:03.457 回答
0
 select distinct SecurityGroup,
    select sum(*) from Attendance where designation = 'officer') as Officer,
    select sum(*) from Attendance where designation = 'Guards') as Guards,
    select sum(*) from Attendance where designation = 'LadyGuards') as LadyGuards    
from Attendance
于 2012-06-07T14:05:58.667 回答
0

您可以使用子查询来完成此操作:

SELECT
  SecurityGroup,
  (SELECT COUNT(*) FROM `Attendance` WHERE `Designation` = "officer") AS `Officer`,
  (SELECT COUNT(*) FROM `Attendance` WHERE `Designation` = "Guards") AS `Guards`,
  (SELECT COUNT(*) FROM `Attendance` WHERE `Designation` = "LadyGuards") AS `LadyGuards`
FROM `Attendance`
WHERE `SecurityGroup` = "JJ"

我还没有实际测试过这个查询,因为我只是想和你分享这个概念。

另请注意,这不是完成您需要做的事情的最快方法,但我相信这是最简单的方法。

我希望这对你有用。

于 2012-06-07T14:15:23.617 回答
0

我尝试在 SQL 中使用 PIVOT,但我无法获取计数值。以下是我尝试过的代码:

select SecurityGroup,Officer,Guards,LadyGuards from 
(select SecurityGroup,rDesignation from Attendance 
where SecurityGroup='jj') up
PIVOT (count(Designation) for Designation IN 
(Officer,Guards,LadyGuards)) as pvt

当我执行此查询时,我得到 SecurityGroup,Officer,Guards,LadyGuards JJ,0,0,0

而不是 SecurityGroup,Officer,Guards,LadyGuards JJ,2,1,1

于 2012-06-11T17:01:10.077 回答