Службы отчетов SQL Server 2005: Как подсчитать строки, которые не равны нулю?Любые советы для расчета итогов? - PullRequest
4 голосов
/ 14 июня 2010

Использование служб отчетов в SQL Server 2005: Существует ли способ подсчета только тех записей, которые не равны нулю;похож на "COUNTA" в Excel?Я думаю, что это будет очень простой процесс, но ничего, что я пробовал, не сработало.Например, я попытался использовать следующее выражение для «Завершено», то есть один столбец, который я пытаюсь сосчитать: = count (IIF (Fields! Completed.Value = "END")) Однако, это выдает «неправильное числоаргументы "ошибка.Значение «Завершено» будет иметь значение «Конец» или быть нулевым.

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

Кроме того, я нашел очень мало документации о том, как рассчитать итоговые данные отчетов и как их суммировать по группам.Кто-нибудь есть какие-либо рекомендации о том, что использовать в качестве ссылки?

Обновление: при дальнейшей проверке , выражение = SUM (IIF (IsNothing (Fields! Completed.Value), 0,1))) Действительно возвращает соответствующее количество записей.Я допустил ошибку, полагая, что в отчете будет указано количество записей в фактическом отчете с окончанием для значения.Так как отчет группируется по «Завершено», «Конец» отображается в отчете только один раз для каждого уникального идентификатора (также группируется по выше Завершено).Так что мне действительно нужно считать (суммировать?) На основе промежуточных итогов ... если это вообще возможно.

Ответы [ 3 ]

15 голосов
/ 14 июня 2010
=SUM(IIF(IsNothing(Fields!Completed.Value),0,1))
2 голосов
/ 14 июня 2010

Как правило, если вы пытаетесь суммировать значение столбца, вы должны помнить, что NULL + что-либо - NULL. Таким образом, чтобы обойти это, вы можете сделать что-то вроде:

SELECT SUM(coalesce(col1,0)) col1Sum
  FROM your_table
 WHERE <conditions>

Что делает этот код, так это удостоверится, что если col1 имеет значение NULL, мы устанавливаем его в 0, прежде чем пытаться суммировать, чтобы мы всегда получали действительный результат суммирования.

Поэтому при выполнении таких операций, как получение итоговых отчетов и т. Д., Важно помнить этот шаг при суммировании ваших значений.

Что касается получения записей, которые НЕ являются NULL, вам нужно определить, что это значит. Означает ли это, что «каждый столбец в строке должен быть НЕ НЕДЕЙСТВИТЕЛЕН», только определенные и т. Д.?

Как правило, вы можете проверить столбец на ненулевое, введя:

SELECT *
  FROM your_table
 WHERE col1 IS NOT NULL

Вам нужно будет повторить условие условия WHERE для всех столбцов, которые вы не хотите иметь NULL.

0 голосов
/ 15 июня 2010

В своем последнем комментарии вы говорите: «Мне действительно нужно считать (суммировать?) На основе промежуточных итогов ... если это вообще возможно»

Способ обойти это в SSRS - это вычислить набор данных для отчета, в котором есть столбцы для моих значений промежуточных итогов. По сути, я предварительно вычисляю промежуточные итоги, а затем эти значения доступны везде в моем отчете. Это можно сделать в отчете datamart или в хранимой процедуре, которая создает набор данных. Хотя это немного неловко, я считаю, что иногда это проще, чем пытаться подчинить SSRS своей воле. Думаю, я бы упомянул об этом, если это будет полезно.

Вы можете выполнить этот код, чтобы получить визуальное представление о том, что я имею в виду -

-- use this code to create a sample data set 
-- Note that I am simply stuffing the correct subtotal values in - 
-- but in reality, you would calculate these from your base data
CREATE TABLE SampleDataSet( Salesperson varchar(50), Region varchar(20), 
Country varchar(30), Sales float, RegionSales float, CountrySales float, GrandTotalSales float ) 

INSERT INTO SampleDataSet Values( 'Brown', 'East', 'Canada', 1000.40, 6780.00, 108686.56, 705043.89 ) 
INSERT INTO SampleDataSet Values( 'Smith', 'East', 'Canada', 3420.76, 6780.00, 108686.56, 705043.89 ) 
INSERT INTO SampleDataSet Values( 'Williams', 'East', 'Canada', 2358.84, 6780.00, 108686.56, 705043.89 ) 
INSERT INTO SampleDataSet Values( 'Simons', 'West', 'Canada', 6298.68, 101906.56, 108686.56, 705043.89 ) 
INSERT INTO SampleDataSet Values( 'Miller', 'West', 'Canada', 95607.88, 101906.56, 108686.56, 705043.89 )
INSERT INTO SampleDataSet Values( 'Knight', 'North', 'UK', 596357.33, 596357.33, 596357.33, 705043.89 ) 

-- inspect data 
SELECT * FROM  SampleDataSet

SELECT Region, SUM(Sales) as RegionSales FROM  SampleDataSet
GROUP BY Region

SELECT Country, SUM(Sales) as CountrySales FROM  SampleDataSet
GROUP BY Country

SELECT SUM(Sales) as GrandTotalSales FROM  SampleDataSet
...