Показать группу без данных в Crystal Reports 12

Я пытаюсь сгруппировать свои данные по возрасту. Я использую следующий выбор базы данных:

select * from (
select 0 range_start, 11 range_end, '0-10 days' date_description from dual union
select 11, 21, '11-20 days' from dual union  
select 21, 31, '21-30 days' from dual union  
select 31, 99999, '31+ days' from dual) date_helper
left outer join table
on table.date <= date_helper.range_start*-1 + sysdate 
and table.date > date_helper.range_end*-1 + sysdate 

Затем я создаю группу на основе столбца date_description. Я пытаюсь заставить его отображать все группы, даже если нет записей, которые попадают в эту группу. Если записей нет, я хочу, чтобы он имел значение 0 и все равно печатал группу.


person ntsue    schedule 04.10.2010    source источник


Ответы (2)


Расширяя комментарий к ответу PowerUser, если вы используете версию Crystal, которая позволяет вам вводить свой собственный SQL (вместо того, чтобы использовать Crystal Database Expert), вы можете настроить подзапрос, который действует как вспомогательная таблица - что-то подобно:

select * from (
select 0 range_start, 11 range_end, '0-10 days' date_description from dual union
select 11, 21, '11-20 days' from dual union  
select 21, 31, '21-30 days' from dual union  
select 31, 99999, '31+ days' from dual) date_helper
left outer join 
(select sysdate-5 mydate from dual union all 
 select sysdate - 25 from dual) mytable
on mytable.mydate <= date_helper.range_start*-1 + sysdate 
and mytable.mydate > date_helper.range_end*-1 + sysdate 

(Синтаксис Oracle — точный синтаксис запроса зависит от того, какой диалект SQL вы используете.)

РЕДАКТИРОВАТЬ: изменен синтаксис SQLServer на Oracle.

ДОПОЛНИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ: добавлены некоторые простые примеры данных.

person Community    schedule 05.10.2010
comment
Это сработало !, я этого не осознавал, потому что мне пришлось настроить оператор select и т. Д. Большое вам спасибо !!! - person ntsue; 08.10.2010

(+1 за полноту вашего вопроса. Добро пожаловать в ТАК!)

Если для группы нет записей, то, очевидно, Crystal не может сообщить об этом. Я рекомендую создать «вспомогательную» таблицу в вашем источнике данных. Вот что я бы сделал, используя некоторую форму SQL:

  1. Составьте «вспомогательную» таблицу. Он будет иметь 1 столбец и будет содержать все группы, которые вы хотите отобразить. Если имена групп являются динамическими, вы можете использовать запрос на выборку или запрос на создание таблицы.

  2. Правое соединение из вашей вспомогательной таблицы с вашей таблицей данных. Отправьте объединенные данные в Crystal.

  3. В Crystal используйте столбец вспомогательной таблицы в своих группировках и вычислениях возрастного сегмента.

Кроме того, в вашем расчете вы должны добавить строку: Else "No age";

person PowerUser    schedule 04.10.2010
comment
Привет PowerUser, Спасибо за ваш ответ. Есть ли способ добиться того, чего я хочу, без внесения изменений на стороне сервера? Спасибо еще раз! - person ntsue; 05.10.2010
comment
@ntsue, если вы используете версию Crystal, которая позволяет вам вводить свой собственный SQL (вместо того, чтобы использовать Crystal Database Expert), вы можете настроить подзапрос, который действует как вспомогательная таблица - что-то вроде ...` из (выберите 0 начало, 10 конец, '0-10 дней' date_description union выберите 11, 20, '11-20 days' union выберите 21, 30, '21-30 days' union выберите 31, 99999, '31+ дней ') date_helper,`... - person ; 05.10.2010
comment
@Марк: Хорошая идея. Можете ли вы превратить это в полный ответ? Я пытаюсь сделать это сам, и я продолжаю получать ошибки компиляции SQL. - person PowerUser; 05.10.2010
comment
@ntsue, можете ли вы сохранить вспомогательную таблицу в базе данных MS Access или в текстовом файле с разделителями-запятыми, перенести ее в Crystal, а затем выполнить правильное соединение в Crystal? Таким образом, вам не придется вносить какие-либо изменения в ваш «настоящий» источник данных. Если у вас есть контроль над машиной, создающей отчет, это не должно быть проблемой. - person PowerUser; 05.10.2010
comment
@PowerUser, вероятно, это потому, что в своем комментарии я использовал end (зарезервированное слово в SQL) в качестве имени столбца. - person ; 05.10.2010
comment
@PowerUser, мне бы не хотелось экспортировать лишний файл с этим отчетом. Я поговорил об этом со своим руководителем, и ему это решение не особенно понравилось. - person ntsue; 06.10.2010
comment
@Mark, по какой-то причине, когда я пытаюсь использовать поле выражения SQL, я получаю следующую ошибку для очень простого оператора выбора (выберите * из таблицы): Ошибка при компиляции выражения SQL: Ошибка соединителя базы данных: «HY000: [Oracle] [] ODBC][Ora]ORA-00936: отсутствует выражение [код поставщика базы данных: 936]». - person ntsue; 06.10.2010
comment
Я попытался найти эту ошибку в Google, и кажется, что это может быть проблема с драйвером оракула. Мы хотели бы решить эту проблему, не обновляя драйверы наших клиентов. Это все еще кажется осуществимым? - person ntsue; 06.10.2010
comment
@ntsue, оператор выбора был select * from table или (select * from table)? Если это было первое, попробуйте указать поля, которые вы хотите видеть (с псевдонимами по мере необходимости) вместо *; если это было последнее, попробуйте удалить скобки. - person ; 06.10.2010
comment
@Марк, я пробовал. Та же ошибка. Я не знаю, помогает это или нет, но я даже не получаю подсветку синтаксиса или что-то в этом роде. - person ntsue; 06.10.2010
comment
@ntsue, что ты пробовал - оба? - person ; 06.10.2010
comment
ntsue, ваши цели не обновлять драйверы клиента и не экспортировать второй файл кажутся разумными, но почему вы пытаетесь отправить им весь .rpt? Я всегда просто отправляю своим конечным пользователям готовый PDF-файл. (Я спрашиваю это в основном для своих собственных знаний). - person PowerUser; 06.10.2010
comment
@PowerUser, мы заключаем rpt в исполняемый файл, чтобы они могли запускать отчет для разных параметров, а не отправлять статический PDF. @Mark, я попытался указать поля, которые хотел выбрать. Раньше я не писал это в скобках. - person ntsue; 06.10.2010
comment
@ntsue, в таком случае я в тупике. До сих пор вы использовали Crystal Database Expert исключительно в отчетах для Oracle? - person ; 06.10.2010
comment
@ Марк, да .. Я новичок в работе с этими отчетами, и мне никогда раньше не приходилось использовать поля выражений sql. - person ntsue; 06.10.2010
comment
@ntsue, поля выражений SQL были не тем, что я имел в виду; они не определяют набор данных — они похожи на формулы Crystal, но написаны на языке структурированных запросов (SQL), а не на языке формул Crystal Reports. Какую версию Кристалла вы используете? - person ; 06.10.2010
comment
@ntsue, я полагаю, что Марк ссылается на Базу данных->Эксперт по базе данных->Данные->Текущие соединения->Добавить команду - person PowerUser; 06.10.2010
comment
Ох, извините, я такой хрустальный нуб. Я сделал то, что вы, ребята, предложили, и внутреннее соединение заработало. Так что теперь я извлекаю все из этой команды. Тем не менее, я до сих пор не уверен, как получить группу без данных для отображения. - person ntsue; 07.10.2010
comment
@ntsue, если у вас есть работающее соединение со вспомогательной таблицей, ответ состоит в том, чтобы сделать его левым внешним соединением из вспомогательной таблицы в таблицу данных (или правым внешним соединением из таблицы данных во вспомогательную таблицу). - person ; 07.10.2010
comment
@Mark, я использую левое внешнее соединение, как вы предложили, из вспомогательной таблицы в таблицу данных, и я группирую свои данные на основе date_description. Однако, кроме того, что для запуска отчета требуется гораздо больше времени, я получаю те же результаты и проблемы. Есть идеи? - person ntsue; 08.10.2010
comment
@ntsue, не могли бы вы изменить свой вопрос, включив в него запрос, выполняемый вашим отчетом? - person ; 08.10.2010
comment
@ntsue, вы пытались выполнить этот запрос в инструменте запросов, таком как TOAD, SQLDeveloper или SQLPlus? Я изменил запрос в своем дополнительном ответе, чтобы включить пару строк фиктивных данных - когда я пытаюсь запустить его в TOAD, он включает строки как для диапазонов с данными в таблице данных, так и для диапазонов без данных в таблице данных. Если вы не видите строки вспомогательной таблицы для диапазонов без данных в таблице данных в результатах запроса, можете ли вы попробовать запустить измененный пример и сообщить нам о результатах? - person ; 08.10.2010
comment
@Mark, @PowerUser Спасибо, ребята!! Очень признателен! - person ntsue; 08.10.2010