|
|
|
Как разделить данные на 10 групп?
|
|||
|---|---|---|---|
|
#18+
Вопрос вот какой, у меня есть имущество с различной степенью износа (от 0 до 100%) мне нужно в запросе разделить всё имущество на 10 групп: от 0 до 10% - первая группа, от 11 до 20% - вторая и т.д. В табличке 150000 записей Как это можно сделать? На ум лезет много If-ов, но это глючно (я писал недавно в форуме, что аксесс вылетает), да и тупо это выглядит 10 ифов вложенных :) Может кто такое уже проделывал? Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2004, 15:56 |
|
||
|
Как разделить данные на 10 групп?
|
|||
|---|---|---|---|
|
#18+
ЧТо значит разделить на 10 групп? - сгурппировать в одном select - проставить номер группы в новый столбец - свое Давайте нам пример: - структура таблицы - тестовые данные - что хотите получить Телепаты в отпуске (с) не мой ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2004, 16:00 |
|
||
|
Как разделить данные на 10 групп?
|
|||
|---|---|---|---|
|
#18+
select *, (-int(-износ/10)) as группа from запрос ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2004, 16:01 |
|
||
|
Как разделить данные на 10 групп?
|
|||
|---|---|---|---|
|
#18+
зы. (с) Владимир Саныч ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2004, 16:02 |
|
||
|
Как разделить данные на 10 групп?
|
|||
|---|---|---|---|
|
#18+
Если процент износа это число, то может это поможет: Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2004, 16:02 |
|
||
|
Как разделить данные на 10 групп?
|
|||
|---|---|---|---|
|
#18+
lobodavaЕсли процент износа это число, то может это поможет: Код: plaintext 1. тогда уж Код: plaintext 1. ибо группа 1 состоит из 11 элементов, а остальные из 10 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2004, 16:09 |
|
||
|
Как разделить данные на 10 групп?
|
|||
|---|---|---|---|
|
#18+
Опять меня ни за что ни про что откопирайтили... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2004, 16:10 |
|
||
|
Как разделить данные на 10 групп?
|
|||
|---|---|---|---|
|
#18+
Да, а в моем случае select *, (-int(-износ/10)-(износ=0)) as группа from запрос ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2004, 16:11 |
|
||
|
Как разделить данные на 10 групп?
|
|||
|---|---|---|---|
|
#18+
2 Саныч вот за это тебя откопирайтили :) Как округлить число ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2004, 16:12 |
|
||
|
Как разделить данные на 10 групп?
|
|||
|---|---|---|---|
|
#18+
GeoДа, а в моем случае select *, (-int(-износ/10)-(износ=0)) as группа from запрос не явное преобразование типов - однако а так сразу и не догадаешься круто завернул :) мнеб и в голову не пришло дык - так и мой вариант можно переделать :) Код: plaintext 1. чтоб без iif :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2004, 16:16 |
|
||
|
Как разделить данные на 10 групп?
|
|||
|---|---|---|---|
|
#18+
Вот, а я бы в цикле 10 раз выполняла бы запрос на выборку и там... добавление куда надо(в группу) с передачей параметра на выборку увеличенного на 10 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2004, 16:20 |
|
||
|
Как разделить данные на 10 групп?
|
|||
|---|---|---|---|
|
#18+
И долго мы будем гадать? Автора в студию!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2004, 16:29 |
|
||
|
Как разделить данные на 10 групп?
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. (Износ=0) при истине = (-1) !!! поэтому Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2004, 16:32 |
|
||
|
Как разделить данные на 10 групп?
|
|||
|---|---|---|---|
|
#18+
2 paparome Не совсем так. Оригинал правильнее: Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2004, 16:33 |
|
||
|
Как разделить данные на 10 групп?
|
|||
|---|---|---|---|
|
#18+
Да, сам понял что не прав. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2004, 16:35 |
|
||
|
Как разделить данные на 10 групп?
|
|||
|---|---|---|---|
|
#18+
2 Geo А где сказано что поле износ не целое? Судя по от 0 до 10% - первая группа, от 11 до 20% - вторая и т.д. как раз целое, т.к. <=10 - это первая группа, а вторая только от >=11 т.е. нет четкого указания, куда попадет часть между 10 и 11. А так - да, твой вариант более корректный :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2004, 16:51 |
|
||
|
Как разделить данные на 10 групп?
|
|||
|---|---|---|---|
|
#18+
Я видимо не очень доходчиво описал задачу, либо не понял ваших предложений. Теперь подробнее напишу (кстати я уже сделал, создав функцию в VBA с теми самыми 10 if , которые правда не глючат, использую её в запросе, а функция возвращает номер группы. Кстати как тут в форуме воткнуть код, чтобы он цветной стал?) Вот в чём фишка. Мне нужно имущество разбить не по износу, а по коеффициенту изношенности = 100% - остаточная стоимость/балансовая ст-ть*100%. Всё имущество должно распределиться на 10 групп: 0-10; 10-20; 20-30;30-40;40-50;50-60;60-70;70-80;80-90;90-100. Вообще у меня запрос с группировкой по группам, который считает суммы балансовой, остаточной и количество объектов в группе - тут всё работает нормально. Только вот что проскальзывает: если я в запросе ставлю условия на выборку (к примеру хочу отобрать только 1 и 2 группы) часть записей выбирается нормуль, а в какой-то момент вылазиет ошибка (это если убираю группировку и хочу просто объекты из групп выбрать) Вот функция, которая у меня делит всё на группы. Как я понимаю она выполняется для каждой записи. Что у меня не так? vv - коэффициент износа, он в запросе считается Вот строка запроса "Группа износа: round_group(100-Round([Остаточная]/[Балансовая]*100;2))" Function round_group(ByVal vv As Double) As Integer If vv >= 0 And vv < 10 Then round_group = 1 Else If vv >= 10 And vv < 20 Then round_group = 2 Else If vv >= 20 And vv < 30 Then round_group = 3 Else If vv >= 30 And vv < 40 Then round_group = 4 Else If vv >= 40 And vv < 50 Then round_group = 5 Else If vv >= 50 And vv < 60 Then round_group = 6 Else If vv >= 60 And vv < 70 Then round_group = 7 Else If vv >= 70 And vv < 80 Then round_group = 8 Else If vv >= 80 And vv < 90 Then round_group = 9 Else If vv >= 90 And vv <= 100 Then round_group = 10 End If End If End If End If End If End If End If End If End If End If End Function ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2004, 07:01 |
|
||
|
Как разделить данные на 10 групп?
|
|||
|---|---|---|---|
|
#18+
Это работает -------------------------------- SELECT round_group(100-Round([Остаточная]/[Балансовая]*100,2)) AS [Группа износа], Count([_БАЗА (2004-05)].[Инв №]) AS [Кол-во], Sum([_БАЗА (2004-05)].Балансовая) AS [Балансовая ст-ть], Sum([_БАЗА (2004-05)].Остаточная) AS [Остаточная ст-ть] FROM SPR_Контрагент_18 INNER JOIN [_БАЗА (2004-05)] ON SPR_Контрагент_18.Код = [_БАЗА (2004-05)].[Шифр контрагента] WHERE ((([_БАЗА (2004-05)].[Вид ОС]) Like "0101*" Or ([_БАЗА (2004-05)].[Вид ОС]) Like "0201*" Or ([_БАЗА (2004-05)].[Вид ОС]) Like "0202*" Or ([_БАЗА (2004-05)].[Вид ОС]) Like "0203*" Or ([_БАЗА (2004-05)].[Вид ОС]) Like "020401*" Or ([_БАЗА (2004-05)].[Вид ОС]) Like "020402*" Or ([_БАЗА (2004-05)].[Вид ОС]) Like "0205*" Or ([_БАЗА (2004-05)].[Вид ОС]) Like "0206*" Or ([_БАЗА (2004-05)].[Вид ОС]) Like "0208*" Or ([_БАЗА (2004-05)].[Вид ОС]) Like "0209*") AND (([_БАЗА (2004-05)].[Степень использования])="07" Or ([_БАЗА (2004-05)].[Степень использования])="08")) GROUP BY round_group(100-Round([Остаточная]/[Балансовая]*100,2)); -------------------------------- А вот это выдаёт вышеописанную ошибку -------------------------------- SELECT round_group(100-Round([Остаточная]/[Балансовая]*100,2)) AS [Группа износа], [_БАЗА (2004-05)].[Инв №] AS [Кол-во], [_БАЗА (2004-05)].Балансовая AS [Балансовая ст-ть], [_БАЗА (2004-05)].Остаточная AS [Остаточная ст-ть] FROM SPR_Контрагент_18 INNER JOIN [_БАЗА (2004-05)] ON SPR_Контрагент_18.Код = [_БАЗА (2004-05)].[Шифр контрагента] WHERE (((round_group(100-Round([Остаточная]/[Балансовая]*100,2)))=1 Or (round_group(100-Round([Остаточная]/[Балансовая]*100,2)))=2) AND (([_БАЗА (2004-05)].[Вид ОС]) Like "0101*" Or ([_БАЗА (2004-05)].[Вид ОС]) Like "0201*" Or ([_БАЗА (2004-05)].[Вид ОС]) Like "0202*" Or ([_БАЗА (2004-05)].[Вид ОС]) Like "0203*" Or ([_БАЗА (2004-05)].[Вид ОС]) Like "020401*" Or ([_БАЗА (2004-05)].[Вид ОС]) Like "020402*" Or ([_БАЗА (2004-05)].[Вид ОС]) Like "0205*" Or ([_БАЗА (2004-05)].[Вид ОС]) Like "0206*" Or ([_БАЗА (2004-05)].[Вид ОС]) Like "0208*" Or ([_БАЗА (2004-05)].[Вид ОС]) Like "0209*") AND (([_БАЗА (2004-05)].[Степень использования])="07" Or ([_БАЗА (2004-05)].[Степень использования])="08")); -------------------------------- ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2004, 07:05 |
|
||
|
Как разделить данные на 10 групп?
|
|||
|---|---|---|---|
|
#18+
Функция читается тоскливо. Для таких случаев вместо If следует применять инструкцию Select Case. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2004, 07:37 |
|
||
|
Как разделить данные на 10 групп?
|
|||
|---|---|---|---|
|
#18+
Нда :( Без пол литры не разобраться. А предлагали тут аналог вашей функции - только без нее, т.е. можно заменить вашу функцию выражением, в данном случае таким 1 + w \ 10 + (w=100) (w=100) - это для того, чтобы при 100 выдавал 10, а не 11 для большей чиабельности можно так: iif(w=100; 10; 1 + w \ 10) ЗЫ: для красивости используй кнопку Код: plaintext и ту же кнопку, только руками впиши Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2004, 09:11 |
|
||
|
Как разделить данные на 10 групп?
|
|||
|---|---|---|---|
|
#18+
Спасибо :) Смеялся, прочитав "без поллитра не разберёшься" :) Попробую Код: plaintext Жалко, что никто не написал почему выходит ошибка... Видимо нужно поставить поллитра :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2004, 09:52 |
|
||
|
|

start [/forum/topic.php?fid=45&msg=32557413&tid=1673825]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
180ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
| others: | 222ms |
| total: | 478ms |

| 0 / 0 |
