Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Assoll
Guest |
Приветствую! Такая задача, в таблице хранится разбросанные значения:
DocNumber, DivTime
1 5
2 9
3 140
4 21
5 2
6 4
7 360
8 1800
.................. Как одним селектом вывести, сколько строк попало в диапазон <1, сколько в 1..5 и сколько в >5 ? И т.д., их может быть много больше. Пробовал так: CASE WHEN T.DivTime < 1 THEN COUNT(T.DocNumber) END 'DOC AMOUNT (<1 SEC)', CASE WHEN T.DivTime >= 1 AND T.DivTime < 5 THEN COUNT(T.DocNumber) END 'DOC AMOUNT (1..5 SEC)', CASE WHEN T.DivTime >= 5 AND T.DivTime < 10 THEN COUNT(T.DocNumber) END 'DOC AMOUNT (5..10 SEC)', CASE WHEN T.DivTime >= 10 AND T.DivTime < 15 THEN COUNT(T.DocNumber) END 'DOC AMOUNT (10..15 SEC)' ругается "Column '********.DivTime' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause." подставляю в GROUP BY: CASE WHEN T.DivTime < 1 THEN 'DOC AMOUNT (<1 SEC)' END, CASE WHEN T.DivTime >= 1 AND T.DivTime < 5 THEN 'DOC AMOUNT (1..5 SEC)' END, CASE WHEN T.DivTime >= 5 AND T.DivTime < 10 THEN 'DOC AMOUNT (5..10 SEC)' END, CASE WHEN T.DivTime >= 10 AND T.DivTime < 15 THEN 'DOC AMOUNT (10..15 SEC)' END Всё равно не нравится.. ПРОШУ ПОМОЩИ СПАСИБО |
13 фев 14, 13:05 [15562335] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
CASE должен быть внутри COUNT-а |
13 фев 14, 13:10 [15562360] Ответить | Цитировать Сообщить модератору |
pio777 Member Откуда: Сообщений: 127 |
Assoll, Попробуйте так: COUNT(CASE WHEN T.DivTime < 1 THEN T.DocNumber END) AS [DOC AMOUNT (<1 SEC)], ... |
13 фев 14, 13:12 [15562382] Ответить | Цитировать Сообщить модератору |
StarikNavy Member Откуда: Москва Сообщений: 2396 |
Assoll,select sum( [DOC AMOUNT (<1 SEC)]) as 'DOC AMOUNT (<1 SEC)' sum( [DOC AMOUNT (1..5)] as 'DOC AMOUNT (1..5)' ... from ( select CASE WHEN T.DivTime < 1 THEN 1 else 0 END as 'DOC AMOUNT (<1 SEC)' ,CASE WHEN T.DivTime >= 1 AND T.DivTime < 5 THEN 1 else 0 END as 'DOC AMOUNT (1..5)' ... from ... ) as t |
13 фев 14, 13:13 [15562393] Ответить | Цитировать Сообщить модератору |
Assoll
Guest |
ПОКЛОН ВАМ, БРАТЬЯ И СЕСТРЫ! ВСЁ ПОЛУЧИЛОСЬ! |
||
13 фев 14, 13:37 [15562589] Ответить | Цитировать Сообщить модератору |
Assoll
Guest |
Люди добрые! Ещё вопрос, пожалуйста! Почему когда делю COUNT на COUNT отбрасываются десятичные знаки?? COUNT(CASE WHEN T.DivTime < 1 THEN T.DocNumber END)/COUNT(T.DocNumber)*100 '<1 SEC, %' Так вообще всегда по нулям (за исключением, когда результат = 100%) COUNT(CASE WHEN T.DivTime < 1 THEN T.DocNumber END)*100/COUNT(T.DocNumber) '<1 SEC, %' А так вроде считается, но, видимо отбрасываются десятичные знаки (просто откидываются без округления) и сумма разложенного ряда не равна 100% СПАСИБО! |
13 фев 14, 17:17 [15564015] Ответить | Цитировать Сообщить модератору |
Maxx Member [скрыт] Откуда: Сообщений: 24290 |
типы полей потому,что |
13 фев 14, 17:20 [15564031] Ответить | Цитировать Сообщить модератору |
Добрый Э - Эх
Guest |
Целое умножить/поделить на целое - будет целое... Такова арифметика в скульсервере. Умножай на 100.0 и будет тебе счастье |
13 фев 14, 17:22 [15564043] Ответить | Цитировать Сообщить модератору |
Assoll
Guest |
Т.е. преобразований на лету не предусмотрено? |
||
13 фев 14, 17:37 [15564139] Ответить | Цитировать Сообщить модератору |
Assoll
Guest |
ГЫ, COUNT(CASE WHEN T.DivTime < 1 THEN T.DocNumber END)*1.1/1.1*100/COUNT(T.DocNumber) '<1 SEC, %' 22.33766233766233766 31.66666666666666666 100.00000000000000000 28.57142857142857142 25.05947660586835844 |
13 фев 14, 17:44 [15564184] Ответить | Цитировать Сообщить модератору |
Cygapb-007 Member Откуда: Сообщений: 1677 |
Добрый Э - Эх, на 100.0 умножать не гламурно ![]() |
13 фев 14, 17:48 [15564219] Ответить | Цитировать Сообщить модератору |
Assoll
Guest |
Самый красивый вариант, вместо умножения на 100, делить на 0.01 COUNT(CASE WHEN T.DivTime < 1 THEN T.DocNumber END)/0.01/COUNT(T.DocNumber) '<1 SEC, %' SQL сразу понимает, что к чему.. |
13 фев 14, 17:52 [15564245] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |