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明らかに、2 番目のアプローチの方が脆くなく、変更なしでさらに追加しても機能するため、2 番目のアプローチが好まれます。

于 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
  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 に答える
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 に答える