2009-08-17 37 views
47

Nếu tôi có một bảng như thế này:Đếm có điều kiện trên một sân

jobId, jobName, Priority 

Nhờ đó mà ưu tiên có thể là số nguyên từ 1 đến 5.

Vì tôi sẽ cần truy vấn này để tạo ra một biểu đồ trong báo cáo , Tôi sẽ cần hiển thị jobid, jobname và 5 trường được gọi là Priority1, Priority2, Priority3, Priority4. Ưu tiên5.

Priority1 nên đếm số lượng hàng mà lĩnh vực ưu tiên có giá trị 1.

Priority2 nên đếm số lượng hàng mà lĩnh vực ưu tiên có giá trị 2.

Priority3 nên đếm số lượng các hàng có trường ưu tiên có giá trị là 3.

vv

Làm cách nào để làm điều đó một cách nhanh chóng và hiệu quả?

Nhiều Cảm ơn, Kave

+0

bạn có nhiều bản ghi cho một id công việc không? vì vậy jobid 1 có thể nằm trong bảng 10 lần, tất cả đều có những ưu tiên khác nhau? bạn đang sử dụng cơ sở dữ liệu nào? sql server? mysql? –

Trả lời

87

Tôi nghĩ rằng bạn có thể sau

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 

Tuy nhiên tôi không chắc chắn nếu bạn cần đến jobID và JobName trong kết quả của mình nếu xóa chúng và xóa nhóm theo,

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

tôi sẽ cần để hiển thị jobid, jobname và 5 lĩnh vực được gọi là Priority1, Priority2, Priority3, Priority4. Ưu tiên5.

Đã xảy ra sự cố với thiết kế truy vấn của bạn. Bạn đang hiển thị một công việc cụ thể trong mỗi hàng, và vì vậy bạn sẽ có một tình huống trong đó hàng có bốn cột ưu tiên với cột '0' và một cột ưu tiên có '1' (ưu tiên cho công việc đó) hoặc bạn sẽ kết thúc lặp lại số lượng cho tất cả các ưu tiên trên mỗi hàng.

Bạn thực sự muốn hiển thị điều gì ở đây?

4

Sử dụng ANSI SQL-92 Báo cáo CASE, bạn có thể làm một cái gì đó như thế này (có nguồn gốc bảng cộng với trường hợp):

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

Bạn có thể tham gia bảng chống lại chính nó:

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 

Hoặc bạn có thể sử dụng trường hợp bên trong một tổng:

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

Sử dụng COUNT địa chỉ thay vì SUM loại bỏ các yêu cầu đối với một tuyên bố 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

Thao tác này sẽ hoạt động, nhưng sản xuất: Cảnh báo: Giá trị rỗng được loại bỏ bằng phép toán tổng hợp hoặc hoạt động SET khác. – tukushan

2

IIF không phải là một SQL xây dựng tiêu chuẩn, nhưng nếu nó được cơ sở dữ liệu của bạn hỗ trợ, bạn có thể đạt được tuyên bố thanh lịch hơn cho cùng một kết quả:

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

Đếm SELECT (Student_ID) là 'StudentCount' FROM CourseSemOne trong đó Student_ID = 3 Có Count (Student_ID) < 6 và Count (Student_ID)> 0;

+1

Vì đây là một câu trả lời hoàn toàn sai, xin hãy ủng hộ chúng tôi và xóa nó đi – guyarad

Các vấn đề liên quan