Подведение итогов по группам и подгруппам

#crystal-reports #crystal-reports-2008

#crystal-отчеты #crystal-отчеты-2008

Вопрос:

У меня есть отчет crystal, в нем есть оператор group by, основанный на двух полях

  1. Название компании
  2. Тип учетной записи

Теперь Crystal report работает и группируется по «companyname», но не группируется по «типу учетной записи». У меня есть два типа учетных записей: «Обычные» и «Премиум». У одной компании есть оба типа учетных записей у нас, и она работает на обычных, а не на премиум. Как вы думаете, в чем проблема.

Я новичок в Crystal report. Однако я знаком с SQL. Различия, которые я вижу, это

  • Ни для одного столбца не используется агрегатная функция — в SQL для получения значимого результата требуется агрегатное поле
  • В отчете около 10 полей, но группировка по используется только для двух полей — в SQL вы должны группировать по всем полям, если их более двух
  • Поля group by находятся в середине и в конце — опять же, в SQL важен порядок поля groupby

В этом случае я сначала группирую по названию компании, а затем по статусу учетной записи. Любая информация будет полезна.

Обратите внимание, что я сгенерировал эквивалентную инструкцию SQL из Crystal Report. Этот запрос был в порядке, за исключением того, что не было операторов group by. Я сам добавил их и столбец aggregate, и я получаю тот же результат, что и в Crystal (но отчет SQL более точен, поскольку он группируется по обоим полям, а не только по одному).

Редактировать: Пример даты. У каждой компании может быть несколько учетных записей одного и того же типа. Я хочу агрегировать данные по «Названию компании» и «Типу учетной записи», чтобы данные были перечислены следующим образом.

  ---- -------------- ------------- ------ 
| ID | Company Name | AccountType | Sale |
 ---- -------------- ------------- ------ 
| 1  | ABC          | I           | 500  |
| 2  | ABC          | I           | 600  |
| 3  | ABC          | O           | 1000 |
| 4  | ABC          | O           | 2000 |
| 5  | ABC          | O           | 3000 |
| 6  | XYZ          | O           | 2500 |
| 7  | LMN          | O           | 3400 |
 ---- -------------- ------------- ------ 
  

Вывод, который я хочу получить из приведенной выше таблицы,

  -------------- ------------- ------ 
| Company Name | AccountType | Sale |
 -------------- ------------- ------ 
| ABC          | I           | 1100 |
| ABC          | O           | 6000 |
| XYZ          | O           | 2500 |
| LMN          | O           | 3400 |
 -------------- ------------- ------ 
  

Ответ №1:

Обновление, включающее обсуждение комментариев и пересмотренный вопрос:

Существует два основных варианта решения этой проблемы:

1) Пересмотрите SQL для выполнения желаемой агрегации.

2) В Crystal добавьте две группы, одну для компании, затем одну для типа учетной записи.

Перед добавлением групп в crystal у вас есть несколько стандартных разделов, включая заголовок отчета, заголовок страницы, сведения, нижний колонтитул отчета и нижний колонтитул страницы.

Если вы не выполняете группировку, каждая строка, которая считывается в базе данных, будет отображаться в разделе сведений (технически, весь раздел сведений повторяется для каждой строки).

При добавлении первой группы (компании) Crystal добавляет заголовок группы # 1 перед разделом Сведений и заголовок группы # 1 после раздела сведений.

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

Обычно заголовок группы используется для отображения общей информации для этой группировки, которую не нужно повторять для каждой подробной записи. В этом примере мы могли бы отобразить название компании и другую информацию, связанную с компанией.

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

В этом случае мы могли бы добавить агрегат, который суммировал бы сумму продаж, которая была бы общим объемом продаж для этой компании, независимо от типа учетной записи.

При добавлении второй группы она будет выполнять подгруппировку в исходной группе.

Когда будет добавлена вторая группа, Crystal разместит заголовок группы # 2 под заголовком группы # 1 и над деталями и разместит нижний колонтитул группы # 2 непосредственно под деталями и над нижним колонтитулом группы # 1.

На данный момент у вас есть формат отчета, аналогичный следующему:

 Group Header #1 (Company)
  Group Header #2 (Account Type)
    Details (the individual sale records)
  Group Footer #2
Group Header #1
  

В этом случае для каждой компании мы хотим сгруппировать подробные записи по типу учетной записи. Таким образом, мы можем добавить информацию, описывающую тип учетной записи, если захотим, в заголовок группы # 2, и мы можем добавить агрегированные данные в нижний колонтитул группы # 2, чтобы отобразить итоги для каждого типа учетной записи в компании.

Теперь, если все, что требуется, это показать итоговые данные для каждого типа учетной записи в каждой компании, тогда единственный раздел, который нам нужно показать в отчете, — это нижний колонтитул группы # 2. Все поля (компания, тип учетной записи, совокупный объем продаж) доступны в этом нижнем колонтитуле, поэтому нам не нужны никакие дополнительные области.

Комментарии:

1. Да, у одной компании могут быть оба типа учетных записей, хотя это случается редко. Если я сгруппирую по Account Type , отчет будет совершенно другим.

2. Извините, возможно, я был неясен в этом: оставьте группировку компаний как есть, но удалите группировку AccountType. Если у компании несколько типов учетных записей и вы хотите, чтобы они отображались в отчете в согласованном порядке, то вы можете упорядочить по типу учетной записи внутри компании, но это может не потребоваться.

3. Я отредактировал вопрос. Я не смог правильно отформатировать таблицу ASCII. Если вы нажмете кнопку редактирования, вы получите правильную таблицу. Я предоставил оригинал (макет) и требуемый результат. Обратите внимание, что я могу сделать это в SQL, но я не знаком с тем, как все работает в Crystla. Спасибо.

4. Есть ли особая причина, по которой вы не хотите выполнять агрегацию в SQL? Лично я считаю, что гораздо проще заставить SQL выдавать нужные мне результаты в отчете, а не торговаться с Crystal.

5. Если вы хотите выполнить работу в Crystal, то я подозреваю, что часть, которую вам может не хватать, — это то, где выполнить агрегацию. В вашем примере, если вы группируете сначала по компании, а затем по типу учетной записи, единственное место, где вы захотите иметь поля в отчете, — это нижний колонтитул группы # 2. Именно здесь будет выполняться ваша агрегация (в конце каждой уникальной комбинации Компания / группа).