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

--1. Этот запрос извлекает все доступные строки в зависимости от дня (должен быть последний день месяца).

SELECT DISTINCT Salesperson ,c.Cust_Alias ,cost ,eomonth(CreateDate) createdate ,FaxNumber
INTO #equip
FROM PDICompany_2049_01.dbo.Customers c
JOIN PDICompany_2049_01.dbo.Customer_Locations cl ON c.Cust_Key = cl.CustLoc_Cust_Key
JOIN ricocustom..Equipment_OLD e ON e.FaxNumber = c.Cust_ID + '/' + cl.CustLoc_ID
JOIN PDICompany_2049_01.dbo.Charges ch ON ch.Chg_CustLoc_Key = cl.CustLoc_Key
WHERE Salesperson = @Salesperson
   AND ch.Chg_Balance = 0

--2. Этот запрос извлекает первый набор результатов, но фильтрует дальше для соответствия переменной даты

SELECT DISTINCT (cost) EquipCost ,Salesperson ,DATEPART(YEAR, CreateDate) YEAR
   ,DATEPART(MONTH, CreateDate) MONTH ,Cust_Alias ,FaxNumber
INTO #equipcost
FROM #equip
WHERE Salesperson = @Salesperson
   AND DATEPART(MONTH, CreateDate) = DATEPART(MONTH, @Start)
   AND DATEPART(year, CreateDate) = DATEPART(year, @Start)
ORDER BY Cust_Alias

--3. Наконец, получение суммы EquipCost с другими KPI для включения в мой окончательный набор результатов.

SELECT sum(EquipCost) EquipCost ,Salesperson ,YEAR ,MONTH ,Cust_Alias
INTO #temp_equipcost
FROM #equipcost
GROUP BY Salesperson ,year ,month ,Cust_Alias

Теперь я знаю, что мог бы легко сократить это до 2 запросов вместо 3 задним числом (и с тех пор я получил свои результаты в один запрос). Но именно там я ищу ответ. В моем отчете с графическим интерфейсом у меня была строка, которая показывала 180 для стоимости экипировки, но мой запрос показывал 60. Так было до тех пор, пока я не изменил свой запрос на одну итерацию (в отличие от 3), и пока я m по-прежнему получает тот же результат 60, теперь он отображает 60 в моем отчете с графическим интерфейсом.

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

Любые идеи о том, почему использование нескольких временных таблиц повлияет на мои результаты через отчет GUI в SQL Report Builder (ЗДЕСЬ НЕ ИСПОЛЬЗУЕТ VB!), но мой запрос SQL в SSMS работает должным образом? И, чтобы быть ясным, только внесение изменений, описанных в запрос, и их сжатие получили мои результаты, отчет с графическим интерфейсом в построителе отчетов чрезвычайно прост, поэтому ничего сумасшедшего в отношении группировки, выражений и т. д.

1
jw11432 8 Ноя 2019 в 01:10
Не глядя на ваши данные и макет вашего отчета... было бы трудно сказать.
 – 
Harry
8 Ноя 2019 в 01:52
e.FaxNumber = c.Cust_ID + '/' + cl.CustLoc_ID Что? Как это правильно?
 – 
SMor
8 Ноя 2019 в 02:52
Вы удалили файл данных (YourReport.rdl.data), чтобы убедиться, что вы не используете старые данные? stackoverflow.com/ вопросы/18210078/…
 – 
Hannover Fist
8 Ноя 2019 в 19:59

1 ответ

Я думаю, что у вас случайно возникла ситуация, когда вы неправильно очистили временные таблицы (или заполнили временные таблицы несколько раз). В качестве альтернативы временным таблицам вы можете использовать табличные переменные. В равной степени вы можете использовать один запрос из производственных таблиц — используя CTE, если вы хотите, чтобы он «ощущался» как 3 отдельных запроса.

0
avery_larry 8 Ноя 2019 в 04:51