SQL для подсчета числа для каждого значения - PullRequest
0 голосов
/ 31 мая 2019

У меня есть запрос SQL, и я хочу иметь возможность подсчитать общее количество приоритетов, для которых установлены значения «низкий», «средний», «высокий» или «не указан».

В настоящее время он рассчитан максимум на 13 строк, я ожидаю, что будет несколько столбцов с такими значениями, как ... 2, 4, 0

Код:

 SELECT c.Name, COUNT(*) as Count_By_Priority, 
 CASE WHEN cb.Priority = 0 THEN "Unspecified" WHEN cb.Priority = 1 THEN "Low" WHEN cb.Priority = 2 THEN "Medium" WHEN cb.Priority = 3 THEN "High" END as PriorityNumber 
 FROM TABLE 1 cb 
 LEFT JOIN Co c ON c.Id = cb.Id 
 WHERE c.Name LIKE %Name%" 
 GROUP BY c.Id;

Кажется, что для клавиш приоритета выдается «Unspecified», когда я ожидаю минимума или альтернатив.

Ответы [ 4 ]

1 голос
/ 31 мая 2019

Если вы хотите подсчитать каждый приоритет в отдельном столбце, используйте условное агрегирование.

SELECT c.Name, 
 sum(CASE WHEN cb.Priority = 0 THEN 1 else 0 end) as "Unspecified" 
 sum(case WHEN cb.Priority = 1 THEN 1 else 0 end) as "Low" 
 sum(case WHEN cb.Priority = 2 THEN 1 else 0 end) as "Medium" 
 sum(case WHEN cb.Priority = 3 THEN 1 else 0 end) as "High"  
 FROM TABLE 1 cb 
 LEFT JOIN Co c ON c.Id = cb.Id 
 WHERE c.Name LIKE %Name%" 
 GROUP BY c.name;
1 голос
/ 31 мая 2019

Попробуйте это,

SELECT c.Name, COUNT(*) as Count_By_Priority,
CASE WHEN cb.Priority = 0 THEN "Unspecified" 
WHEN cb.Priority = 1 THEN "Low" 
WHEN cb.Priority = 2 THEN "Medium" 
WHEN cb.Priority = 3 THEN "High" END as PriorityNumber 

FROM TABLE 1 cb LEFT JOIN Co c ON c.Id = cb.Id 

WHERE c.Name LIKE %Name%" 

GROUP BY c.Name,PriorityNumber ;
1 голос
/ 31 мая 2019

Вы используете агрегацию, но ваш SELECT не соответствует вашему GROUP BY. Я думаю, что вы собираетесь что-то вроде:

SELECT c.Name, COUNT(*) as Count_By_Priority, 
       (CASE WHEN MAX(cb.Priority) = 0 THEN 'Unspecified'
             WHEN MAX(cb.Priority) = 1 THEN 'Low'
             WHEN MAX(cb.Priority) = 2 THEN 'Medium'
             WHEN MAX(cb.Priority) = 3 THEN 'High'
        END) as PriorityNumber 
FROM TABLE 1 cb LEFT JOIN
     Co c
     ON c.Id = cb.Id 
WHERE c.Name LIKE '%Name%'
GROUP BY c.Id;

Я не уверен, хотите ли вы MAX() или MIN(), но MAX() имеет для меня смысл.

1 голос
/ 31 мая 2019

Я почти уверен, что вы можете просто изменить свою группу по предложению на group by c.Id, затем PriorityNumber:

SELECT 
    c.Name,
    COUNT(*) as Count_By_Priority,
    CASE 
        WHEN cb.Priority = 0 THEN "Unspecified"
        WHEN cb.Priority = 1 THEN "Low"
        WHEN cb.Priority = 2 THEN "Medium"
        WHEN cb.Priority = 3 THEN "High" 
    END as PriorityNumber
FROM TABLE 1 cb 
LEFT JOIN Co c 
ON c.Id = cb.Id
WHERE c.Name LIKE %Name%"
GROUP BY c.Id, PriorityNumber;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...