Форум: "Прочее";
Текущий архив: 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.069 c