2009-08-17 50 views
47

私が持っていた場合には、このようなテーブル:条件付きカウント

私はレポートのグラフを生成するために、このクエリが必要になりますので、優先順位が5

から1の間の整数ことができる

jobId, jobName, Priority 

jobid、jobname、Priority1、Priority2、Priority3、Priority4という5つのフィールドを表示する必要があります。優先度5。

優先1は、優先度フィールドが1

Priority2の値は、優先フィールドが2

Priority3の値の量をカウントするべき有する行の量を数えるべき有する行の量をカウントしなければなりません優先順位フィールドが3

などの値を持つ行

私はどうしたらどのように迅速かつパフォーマンス的に?

多くのおかげで、 KAVE

+0

1つのジョブIDに対して複数のレコードがありますか? jobid 1はテーブル内に10回ある可能性がありますが、すべて優先順位が異なります。また、どのデータベースを使用していますか? SQLサーバー? mysql? –

答えて

87

を私がもし不確実だが、あなたが

select 
    jobID, JobName, 
    sum(case when Priority = 1 then 1 else 0 end) as priority1, 
    sum(case when Priority = 2 then 1 else 0 end) as priority2, 
    sum(case when Priority = 3 then 1 else 0 end) as priority3, 
    sum(case when Priority = 4 then 1 else 0 end) as priority4, 
    sum(case when Priority = 5 then 1 else 0 end) as priority5 
from 
    Jobs 
group by 
    jobID, JobName 

後かもしれないと思います

1
SELECT Priority, COALESCE(cnt, 0) 
FROM (
     SELECT 1 AS Priority 
     UNION ALL 
     SELECT 2 AS Priority 
     UNION ALL 
     SELECT 3 AS Priority 
     UNION ALL 
     SELECT 4 AS Priority 
     UNION ALL 
     SELECT 5 AS Priority 
     ) p 
LEFT JOIN 
     (
     SELECT Priority, COUNT(*) AS cnt 
     FROM jobs 
     GROUP BY 
       Priority 
     ) j 
ON  j.Priority = p.Priority 
-1

私はjobidを、ジョブ名および優先1、Priority2、Priority3、Priority4と呼ばれる5つのフィールドを表示する必要があります。優先度5。

クエリデザインに何か問題があります。各行にも特定のジョブが表示されているので、行には4つの優先度列に「0」があり、優先度列に「1」(そのジョブの優先度)があります。またはすべての行のすべての優先度についてカウントを繰り返すことになります。

ここに実際に何を表示したいですか?

4

ANSI SQL-92 CASEステートメントを使用して、あなたがこの(派生テーブルプラスの場合)のような何かを行うことができます:

SELECT jobId, jobName, SUM(Priority1) 
AS Priority1, SUM(Priority2) AS 
Priority2, SUM(Priority3) AS 
Priority3, SUM(Priority4) AS 
Priority4, SUM(Priority5) AS 
Priority5 FROM (
    SELECT jobId, jobName, 
    CASE WHEN Priority = 1 THEN 1 ELSE 0 END AS Priority1, 
    CASE WHEN Priority = 2 THEN 1 ELSE 0 END AS Priority2, 
    CASE WHEN Priority = 3 THEN 1 ELSE 0 END AS Priority3, 
    CASE WHEN Priority = 4 THEN 1 ELSE 0 END AS Priority4, 
    CASE WHEN Priority = 5 THEN 1 ELSE 0 END AS Priority5 
    FROM TableName 


) 
1

あなた自身のテーブルに参加することができます:

あなたは結果を削除してグループを削除する場合は、結果のjobIDとJobNameが必要です
select 
    t.jobId, t.jobName, 
    count(p1.jobId) as Priority1, 
    count(p2.jobId) as Priority2, 
    count(p3.jobId) as Priority3, 
    count(p4.jobId) as Priority4, 
    count(p5.jobId) as Priority5 
from 
    theTable t 
    left join theTable p1 on p1.jobId = t.jobId and p1.jobName = t.jobName and p1.Priority = 1 
    left join theTable p2 on p2.jobId = t.jobId and p2.jobName = t.jobName and p2.Priority = 2 
    left join theTable p3 on p3.jobId = t.jobId and p3.jobName = t.jobName and p3.Priority = 3 
    left join theTable p4 on p4.jobId = t.jobId and p4.jobName = t.jobName and p4.Priority = 4 
    left join theTable p5 on p5.jobId = t.jobId and p5.jobName = t.jobName and p5.Priority = 5 
group by 
    t.jobId, t.jobName 

それとも、合計の内側にケースを使用することができます。

select 
    jobId, jobName, 
    sum(case Priority when 1 then 1 else 0 end) as Priority1, 
    sum(case Priority when 2 then 1 else 0 end) as Priority2, 
    sum(case Priority when 3 then 1 else 0 end) as Priority3, 
    sum(case Priority when 4 then 1 else 0 end) as Priority4, 
    sum(case Priority when 5 then 1 else 0 end) as Priority5 
from 
    theTable 
group by 
    jobId, jobName 
59

COUNTを使用する代わりにSUMは、ELSE文の要件を削除します。

SELECT jobId, jobName, 
    COUNT(CASE WHEN Priority=1 THEN 1 END) AS Priority1, 
    COUNT(CASE WHEN Priority=2 THEN 1 END) AS Priority2, 
    COUNT(CASE WHEN Priority=3 THEN 1 END) AS Priority3, 
    COUNT(CASE WHEN Priority=4 THEN 1 END) AS Priority4, 
    COUNT(CASE WHEN Priority=5 THEN 1 END) AS Priority5 
FROM TableName 
GROUP BY jobId, jobName 
+0

これは機能しますが、生成されます。 警告:Null値は、集計または他のSET操作によって削除されます。 – tukushan

2

IIFは、標準のSQL構文ではありません、データベースによってサポートされている場合は、同じ結果を生成するより洗練されたステートメントを実現できます。

SELECT JobId, JobName, 

COUNT(IIF (Priority=1, 1, NULL)) AS Priority1, 
COUNT(IIF (Priority=2, 1, NULL)) AS Priority2, 
COUNT(IIF (Priority=3, 1, NULL)) AS Priority3, 
COUNT(IIF (Priority=4, 1, NULL)) AS Priority4, 
COUNT(IIF (Priority=5, 1, NULL)) AS Priority5 

FROM TableName 
GROUP BY JobId, JobName 
-1

「StudentCount」としてSELECT Count(Student_ID)からCourseSemOne Student_ID = 3 Count(Student_ID)の場合< 6およびCount(Student_ID)> 0;

+1

これは完全に間違った回答ですので、私たちにすべて賛成して削除してください – guyarad

関連する問題