У меня было несколько строк кода 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, а оно мне нужно, потому что оно не всегда в правильном порядке. Есть ли способ включить заказ в такой ситуации?
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
... или, как сказали другие комментаторы, почему порядок имеет значение?
Почему бы не посчитать прямо в первой части кода?
let lv_sql = " select count(table.idno) from table ",
" where table.status != 'X' ",
" and table.idno <= 10 ",
" order by table.idno "
Это работает ?
Я считаю, что ваша проблема в том, как вы подсчитываете. Если я не ошибаюсь, ваш 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"
Пожалуйста, дайте мне знать, если это то, что вы искали
Похожие вопросы
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.