Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Выборка по Гауссу  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Выборка по Гауссу  [new]
Glory
Member

Откуда:
Сообщений: 104751
CASE должен быть внутри COUNT-а
13 фев 14, 13:10    [15562360]     Ответить | Цитировать Сообщить модератору
 Re: Выборка по Гауссу  [new]
pio777
Member

Откуда:
Сообщений: 127
Assoll,

Попробуйте так:
COUNT(CASE WHEN  T.DivTime < 1 THEN T.DocNumber END) AS [DOC AMOUNT (<1 SEC)],
...
13 фев 14, 13:12    [15562382]     Ответить | Цитировать Сообщить модератору
 Re: Выборка по Гауссу  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2428
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]     Ответить | Цитировать Сообщить модератору
 Re: Выборка по Гауссу  [new]
Assoll
Guest
CASE должен быть внутри COUNT-а

ПОКЛОН ВАМ, БРАТЬЯ И СЕСТРЫ!
ВСЁ ПОЛУЧИЛОСЬ!
13 фев 14, 13:37    [15562589]     Ответить | Цитировать Сообщить модератору
 Re: Выборка по Гауссу  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Выборка по Гауссу  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
типы полей потому,что
13 фев 14, 17:20    [15564031]     Ответить | Цитировать Сообщить модератору
 Re: Выборка по Гауссу  [new]
Добрый Э - Эх
Guest
Целое умножить/поделить на целое - будет целое... Такова арифметика в скульсервере.
Умножай на 100.0 и будет тебе счастье
13 фев 14, 17:22    [15564043]     Ответить | Цитировать Сообщить модератору
 Re: Выборка по Гауссу  [new]
Assoll
Guest
Добрый Э - Эх
Целое умножить/поделить на целое - будет целое... Такова арифметика в скульсервере.
Умножай на 100.0 и будет тебе счастье

Т.е. преобразований на лету не предусмотрено?
13 фев 14, 17:37    [15564139]     Ответить | Цитировать Сообщить модератору
 Re: Выборка по Гауссу  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Выборка по Гауссу  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
Добрый Э - Эх,

на 100.0 умножать не гламурно
13 фев 14, 17:48    [15564219]     Ответить | Цитировать Сообщить модератору
 Re: Выборка по Гауссу  [new]
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 Ответить