У меня было несколько строк кода Informix-4GL, которые делают следующее

##
# prepare sql
##

let lv_sql = " select table.idno from table ",
             " where table.status != 'X' ",
             " and table.idno <= 10 ",
             " order by table.idno "
prepare table_sel from lv_sql
declare table_cur cursor for table_sel

##
# loop through results and count them
##

let count = 0

foreach table_cur into ti_num
   let count = count + 1
end foreach

display count

Итак, я получаю общее количество строк в конкретной таблице, которые меньше 10 в правильной последовательности, но мне нужен цикл foreach, чтобы подсчитать общее количество

У меня есть второй способ, который я предпочитаю

##
# prepare sql
##

let lv_sql = " select count(table.idno) from table ",
             " where table.idno in ( ",
             "    select table.idno from table "
             "    where table.status != 'X' ",
             "    and table.idno <= 10 ",
             " ) "
prepare table_sel from lv_sql

##
# just get result
##

execute table_sel into count

display count

Проблема в том, что второе решение дает сбой, если я включаю предложение order by в фильтр where in, а оно мне нужно, потому что оно не всегда в правильном порядке. Есть ли способ включить заказ в такой ситуации?

-1
TheLovelySausage 6 Сен 2016 в 11:09

3 ответа

Лучший ответ

Я продолжаю перечитывать вопрос и думаю, что ответ ...

let lv_sql = " select table.idno, count(*) ",
             " from table ",
             " where table.status != 'X' ",
             " and table.idno <= 10 ",
             " order by table.idno "
prepare table_sel from lv_sql
declare table_cur cursor for table_sel

foreach table_cur into l_idno, l_count
    ...
end foreach

... или, как сказали другие комментаторы, почему порядок имеет значение?

0
fourjs.reuben 8 Сен 2016 в 22:04

Почему бы не посчитать прямо в первой части кода?

let lv_sql = " select count(table.idno) from table ",
         " where table.status != 'X' ",
         " and table.idno <= 10 ",
         " order by table.idno "

Это работает ?

0
Ethenyl 6 Сен 2016 в 08:14

Я считаю, что ваша проблема в том, как вы подсчитываете. Если я не ошибаюсь, ваш Select Count будет получать только одно значение, я имею в виду это:

let lv_sql = " select count(table.idno) from table ",
             " where table.idno in ( ",
             "    select table.idno from table "
             "    where table.status != 'X' ",
             "    and table.idno <= 10 ",
             " ) "

Таким образом, нет необходимости заказывать. Если вам нужна ссылка на идентификатор таблицы и подсчет каждого идентификатора, вам нужно добавить это поле в свой первый выбор, а также добавить предложение group by в конце до нужного вам порядка, примерно так:

let lv_sql = " select table.idno, count(table.idno) as counting from table ",
             " where table.idno in ( ",
             "    select table.idno from table "
             "    where table.status != 'X' ",
             "    and table.idno <= 10 ",
             " ) group by table.idno order by counting"

Пожалуйста, дайте мне знать, если это то, что вы искали

0
Ivan Sin miedo 6 Сен 2016 в 18:52