2009-08-17 3 views
47

Если бы я имел таблицу, как это:Условный Count на поле

jobId, jobName, Priority 

Приоритет может Причем быть целым числом от 1 до 5.

Поскольку я должен был бы этот запрос для создания диаграммы по докладу , Мне нужно будет отобразить jobid, jobname и 5 полей, называемых Priority1, Priority2, Priority3, Priority4. Priority5.

Приоритет 1 следует считать количество строк, где поле приоритета имеет значение 1.

Priority2 следует считать количество строк, где поле приоритета имеет значение 2.

Priority3 следует считать количество строки, в которых поле приоритета имеет значение 3.

и т.д.

Как бы я сделать это быстро и производительным способом?

Большое спасибо, Kave

+0

У вас есть несколько записей для одного идентификатора задания? поэтому 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 

Однако я не уверен, если вам нужно указать идентификатор 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, и имя задания 5 полей, называемых Приоритетом 1, Priority2, Priority3, приоритет4. Priority5.

Что-то не так с вашим дизайном запроса. Вы также показываете определенное задание в каждой строке, так что у вас будет либо ситуация, когда в каждой строке есть четыре столбца с приоритетом, столбец «0» и один приоритет с «1» (приоритет для этого задания) или вы в конечном итоге повторите подсчет для всех приоритетов в каждой строке.

Что вы действительно хотите здесь показать?

4

Использование ANSI SQL-92 СЛУЧАЕВ заявления, вы могли бы сделать что-то вроде этого (производная таблица плюс случай):

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

Вы можете присоединиться к таблице против себя:

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

SELECT Count (Student_ID) как 'StudentCount' FROM CourseSemOne где Student_ID = 3 Имеет счетчик (Student_ID) < 6 и Count (Student_ID)> 0;

+1

Поскольку это совершенно неправильный ответ, пожалуйста, сделайте нам все одолжение и удалите его. – guyarad

Смежные вопросы