2010-02-24 6 views
3

Предположим, у меня есть таблица с 2-мя колонками (статус и дата), как следующее:помощь в подсчете SQL

status: U T U U L  
date: 12 14 15 16 17 

Могу ли я (используя только один SQL заявление) подсчитывают число различных значений в статусе? То есть:

  • счетчик (U) = 3
  • счетчик (Т) = 1
  • Количество (L) = 2
  • Количество (Р) = 0

Могу ли я сделать это с помощью 1 SQL-запроса?

Примечание: У меня есть статические значения в статусе. Я могу только (U-T-L-P)

+1

Какой двигатель базы данных вы используете? – Kris

+0

Получение нулевого значения для P, которое не появляется, является жесткой частью этого. Вам понадобится список допустимых значений в какой-либо таблице, с которой вы сможете работать. –

+0

Я использую sql server 2008. в любом случае thx много. я решил проблему после прочтения сообщений :) – scatman

ответ

1

Это возвращает строку для каждого status и счет во втором столбце:

SELECT Status, COUNT(*) Cnt 
FROM Tbl 
GROUP BY Status 

Так было бы вернуть

Status Cnt 
U  3 
T  1 
L  1 

для примера (не в определенном порядке) , Используйте ORDER BY, если хотите, чтобы отсортировать результаты.

3

Вы должны использовать Group By:

SELECT Status, Count(Status) 
FROM table 
GROUP BY Status 

Это не будет возвращать P = 0 если P не заполняется в таблице. В вашей логике приложения вам нужно будет проверить, и если определенный статус не возвращается, это означает, что нет записей (т. Е. 0).

SQL не может запрашивать записи, которых там нет.

1

Вы можете сделать это с помощью запроса, который группируется в столбце состояния, например.

SELECT COUNT(*) as StatusCount, Status 
FROM MyTable 
GROUP BY Status 
0

Чтобы получить нулевое значение для статуса P, вам нужно сделать некоторые коварные вещи, используя таблицу, в которой перечислены все возможные статусы.

SELECT COUNT(A.Status), B.Status 
    FROM AnonymousTable AS A RIGHT OUTER JOIN 
     (SELECT 'P' AS Status FROM Dual 
     UNION 
     SELECT 'U' AS Status FROM Dual 
     UNION 
     SELECT 'L' AS Status FROM Dual 
     UNION 
     SELECT 'T' AS Status FROM Dual 
     ) AS B ON A.Status = B.Status 
GROUP BY B.Status; 

4-way UNION - один из способов генерации списка значений; ваша СУБД может предоставить более компактные альтернативы. Я предполагаю, что таблица Dual содержит только одну строку (как показано в Oracle).

COUNT (A.Status) подсчитывает количество ненулевых значений в A.Status. RIGHT OUTER JOIN отображает строку из B с Status = 'P' и соединяет ее с единственным NULL для A.Status, который, следовательно, COUNT (A.Status) считается равным нулю. Если вы использовали COUNT (*), вы получите 1 для подсчета.

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