Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2008.01.20;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.05 c
15-1197899371
vajo
2007-12-17 16:49
2008.01.20
Intel выпустила самый маленький твердотельный накопитель


15-1197296712
fics
2007-12-10 17:25
2008.01.20
Графопостроитель


15-1197744591
GeLLeR
2007-12-15 21:49
2008.01.20
Протестите прогу


15-1197729092
Jade
2007-12-15 17:31
2008.01.20
TotalComander


2-1198224335
Kolan
2007-12-21 11:05
2008.01.20
Так все таки использовать ли TADOCommand всегда?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский