Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.01.20;
Скачать: CL | DM;

Вниз

SQL   Найти похожие ветки 

 
андр   (2007-12-13 12:34) [0]

Есть набор данных с полями Face, Sum

Face   |   Sum

87878   10
54636   5
53425   7
64735   100

Необходимо реализовать запрос чтобы он выводил количество Face ( count(*) )  в промежутка с шагом 50, т.е

Sum       |   Count

0-50          3
50-100       1

и т.д. немогу реализовать как реализовать такой шаг и посчитать количество ?


 
homm ©   (2007-12-13 12:36) [1]

SELECT COUNT(*) FROM Table WHERE `Sum`>"0" AND `Sum`<="50"
Сомневаюсь, что можно как-то по другому.


 
Johnmen ©   (2007-12-13 12:42) [2]


> немогу реализовать

Как именно не можешь?


 
андр   (2007-12-13 12:43) [3]

да но НД очень большой и суммы тоже а шаг надо организовать 50


 
Kerk ©   (2007-12-13 12:48) [4]

SELECT period, count(period) FROM (
 SELECT GetPeriod(Sum)  period
   FROM Table
 )
GROUP BY period

----
ну и GetPeriod будет возвращать строки типа "0-50" или "50-100" в зависимости от значения Sum

может и не работает, думать влом


 
андр   (2007-12-13 12:59) [5]

Есть ли в TSQL оть один цикл где можно организовать шаг ?


 
Johnmen ©   (2007-12-13 13:01) [6]

Зачем цикл, где можно организовать шаг? Всё делается одним запросом.


 
clickmaker ©   (2007-12-13 13:08) [7]

MS SQL 2000

declare @results table([Range] varchar(32), [Count] int)
declare @min int, @max int
set @min = 0
set @max = 50
while (@min < 100)  -- изменить по вкусу
begin

 insert into @results
 select convert(varchar(16), @min) + "-" + convert(varchar(16), @max) as [Range],
        (select count(*) from Faces where [Sum] between @min and @max) as [Count]
 set @min = @min + 50
 set @max = @min + 50
end
select * from @results


 
андр   (2007-12-13 13:09) [8]

Есть некие Лицевые Счита (Ls) у каждого из них есть некая среднемесечная сумма (SMS)

НД :

Ls       |    SMS
00000       1
00001       1,1
00002       1000
00003       50
00004       1
00005       100

Нужно получить отсчет вида:

SMS     |   Count
0-50        4
50-100     1
...
950-1000  1

и т.д.


 
Anatoly Podgoretsky ©   (2007-12-13 13:10) [9]

> андр  (13.12.2007 12:34:00)  [0]

Так ерунда же получится, сумма 50 и в первой и во второй строке.


 
Anatoly Podgoretsky ©   (2007-12-13 13:13) [10]


> Есть некие Лицевые Счита (Ls) у каждого из них есть некая
> среднемесечная сумма (SMS)

И получилась, сумма 50-100 должно быть два.
И советую вспомнить математику деление на модуль.


 
Юрий ©   (2007-12-13 13:17) [11]

> [7] clickmaker ©   (13.12.07 13:08)

Можно обьяснить непонимающему? :)

convert(varchar(16), @min) - 16
convert(varchar(16), @max) - 16
"-"                        - 1
                    итого - 33
[Range] varchar(32) - ?


И второе:

set @max = @min + 50


 
clickmaker ©   (2007-12-13 13:20) [12]

можно, конечно, и одним запросом, если число диапазонов известно

select convert(varchar(16), ranges.[min]) + "-" + convert(varchar(16), ranges.[max]) as [Range],
(select count(*) from Account where [Sum] > ranges.[min] and [Sum] <= ranges.[max]) as [Count]
from (select 0 as [min], 50 as [max] from @tbl
    union select 50 as [min], 100 as [max] from @tbl) ranges
group by [min], [max]


либо, вместо нижнего селекта с объединением, написать функцию, возвращающую табличку с диапазонами, что собственно Керк и предложил в [4]


 
Johnmen ©   (2007-12-13 13:36) [13]


> clickmaker ©   (13.12.07 13:20) [12]
> можно, конечно, и одним запросом, если число диапазонов известно

Можно даже если неизвестно.
АП в [10] и намек уже дал.


 
clickmaker ©   (2007-12-13 14:12) [14]


> [13] Johnmen ©   (13.12.07 13:36)

можно и так )
...
from (select [Sum] / 51 * 50 as [min], [Sum] / 51 * 50 + 50 as [max] from Account) ranges
...


 
Johnmen ©   (2007-12-13 14:17) [15]


> clickmaker ©   (13.12.07 14:12) [14]

Да нет же... Всё проще.
Диапазон вообще не надо знать или вычислять...:)


 
Павел Калугин ©   (2007-12-13 15:15) [16]


> Johnmen ©   (13.12.07 14:17) [15]

неужели trunc(a/b) для группировки достаточно?


 
Anatoly Podgoretsky ©   (2007-12-13 15:17) [17]

> Павел Калугин  (13.12.2007 15:15:16)  [16]

Достаточно, но не во всех СУБД


 
Johnmen ©   (2007-12-13 15:46) [18]


> Павел Калугин ©   (13.12.07 15:15) [16]
> неужели trunc(a/b) для группировки достаточно?

Именно это имелось в виду :)
Во многих последних версиях разных SQL серверов можно группировать по функции.


 
kaif ©   (2007-12-13 16:11) [19]

В firebird 1.5 я только что попробовал

select a/50, count(*)
from mytable
group by 1

Работает.
Firebird позволяет в group by задавать просто номер колонки.


 
clickmaker ©   (2007-12-13 18:34) [20]


> можно группировать по функции

т.е. вызов функции (или выражение) и в самом селекте и в group by?
MS SQL, нпример, не даст сгруппировать по имени вычисляемого поля


 
kaif ©   (2007-12-13 18:54) [21]

clickmaker ©   (13.12.07 18:34) [20]

А по номеру, как я сдела в firebird 1.5 пробовал?

Я давно не работал с MS SQL, но я знаю, что он позволяет как-то делать еще вложенный запрос.

Например в ORACLE прошла бы такая фигня:

select t.aaa, count(*)
from
 (select fff/50 aaa from mytable) t
group by t.aaa


правда, возможно придется fff/50 к целому приводить как-то. нужно смотреть подробнее.


 
clickmaker ©   (2007-12-13 19:00) [22]


> [21] kaif ©   (13.12.07 18:54)
> clickmaker ©   (13.12.07 18:34) [20]
>
> А по номеру

по номеру только order by работает
как вариант, с вложеным запросм, но примерно это я и предлагал в [12] и [14]


 
андр   (2007-12-14 12:31) [23]


> clickmaker ©   (13.12.07 13:08) [7]

Good! Очень Good! Спасибо помагло!



Страницы: 1 вся ветка

Текущий архив: 2008.01.20;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.019 c
2-1198075271
Kerk
2007-12-19 17:41
2008.01.20
Про Excel


15-1197847647
Почтальон
2007-12-17 02:27
2008.01.20
Как создать в Gmail.com папку?


2-1197922608
istok
2007-12-17 23:16
2008.01.20
Overflow ...


2-1198171895
savyhinst
2007-12-20 20:31
2008.01.20
Сменить длину динамического массива строк из процедуры нельзя?


1-1192990151
dreamse
2007-10-21 22:09
2008.01.20
Ускорение работы FileExists