powered by simpleCommunicator - 2.0.35     © 2025 Programmizd 02
Форумы / Отчетные системы [игнор отключен] [закрыт для гостей] / RS matrix отбражение столбцов даже при отсутсвии данных в этой области
14 сообщений из 14, страница 1 из 1
RS matrix отбражение столбцов даже при отсутсвии данных в этой области
    #37993618
Che0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.
Необходимо в matrix сделать отображение всех столбцов из запроса, не зависимо от того есть или нет данные по этому срезу.

DimProduct строки
DimAccount и DimTime столбцы(DimTime родительская группа для DimAccount)
MGFact.Value область данных
вот запрос:
Код: sql
1.
2.
3.
4.
5.
6.
SELECT     DimProduct.Name AS Products, DimProduct.Артикул, DimProduct.Наименование, DimProduct.[Наименование лекарственной формы], MGFact.Value, 
                      DimProduct.ABC, DimAccount.Name AS Account, DimProduct.[Бизнес-юнит], MGFact.Currency_MemberId, DimTime.Name AS tim, DimTime.MemberId AS TimeID
FROM         MGFact INNER JOIN
                      DimProduct ON MGFact.Product_MemberId = DimProduct.MemberId FULL OUTER JOIN
                      DimAccount ON MGFact.Account_MemberId = DimAccount.MemberId FULL OUTER JOIN
                      DimTime ON MGFact.Time_MemberId = DimTime.MemberId


Подскажите пожалуйста как сделать.
...
Рейтинг: 0 / 0
RS matrix отбражение столбцов даже при отсутсвии данных в этой области
    #37994170
Фотография user89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Che0,

данных для анализа маловато будет :(

Возможно вместо inner join использовать Left Join
Или как-то хитро скобки в джойнах расставить.
Или через подзапрос...
...
Рейтинг: 0 / 0
RS matrix отбражение столбцов даже при отсутсвии данных в этой области
    #37994384
Che0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user89, в том то и дело что несмотря на то я использую full join все равно не выводит.
...
Рейтинг: 0 / 0
RS matrix отбражение столбцов даже при отсутсвии данных в этой области
    #37994906
Andrews25
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Che0,
у меня простой SQL - без SSAS
но наверно, проблема такая же
делаю так
допустим нужны данные по некому ID за все месяцы периода и месяцы - это колонки нашего отчета
я принудительно добавляю в результирующий dataset (в хранимой процедуре) данные за те нужные месяцы, когда данных нет НО С НУЛЕВЫМ ID и нулевыми значениями
строки, относящиеся к нулевому ID потом прямо в matrix делаю hidden про условию ID = 0
...
Рейтинг: 0 / 0
RS matrix отбражение столбцов даже при отсутсвии данных в этой области
    #37994923
Фотография user89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Che0,

в прошлом году я купил книгу "Ицик Бен-Ган Microsoft SQL Server 2008. Основы T-SQL"
Купите/скачайте обязательно. Выручит много раз. В ней также хорошо написано, что Left/Full join не стоит перемешивать с inner join .

Вот накидал простенький пример. Если Left Join заменить на Full, результат не изменится
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
declare @a table (aID int, userID int, account varchar(100))
insert @a values (31,41,'Клиент 1'), (32,42,'Клиент 2'), (33,43,'Клиент 3')

declare @sc table (scID int, aID int, naim varchar(100))
insert @sc values (11,31,'Договор 1'), (12,32,'Договор 2'), (13,33,'Договор 3')

declare @proj table (scID int, projName varchar(100))
insert @proj values (11,'Проект 1'), (12,'Проект 2'), (14,'Проект 4')

-- Не выдаст "Договор 3", хотя связь идет через left join и aID=33 есть в обеих таблицах
select a.account, sc.naim, p.projName
from @a a
left join @sc sc on a.aID = sc.aID
inner join @proj p on sc.scID = p.scID

-- Решение 1. Через скобки
select a.account, sc.naim, p.projName
from @a a
left join (@sc sc inner join @proj p on sc.scID = p.scID)
on a.aID = sc.aID

-- Решение 2. Через подзапрос
;with tmp as (
  select sc.aID, sc.naim, p.projName
  from @sc sc inner join @proj p on sc.scID = p.scID
) 
select a.account, tmp.naim, tmp.ProjName
from @a a
left join tmp on a.aID = tmp.aID

...
Рейтинг: 0 / 0
RS matrix отбражение столбцов даже при отсутсвии данных в этой области
    #37995142
Che0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrews25,

а как/где поставить условие на hiden ячейки?
...
Рейтинг: 0 / 0
RS matrix отбражение столбцов даже при отсутсвии данных в этой области
    #37995457
Andrews25
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Che0,

в моем случае hide-ться вся строка
выбирается строка и в контекстном меню Row visibility
пишу условие для hidden =Fields!ID.Value = 0
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
RS matrix отбражение столбцов даже при отсутсвии данных в этой области
    #39365299
jeddite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!
Что-то из всего вышесказанного не понял как все таки сделать отображение в матрице полей для которых нет значений.
У меня есть таблица со столбцами ID,Text1,Text2,Date. Я сделал отчет в RS2008 следующего вид с помощью Matrix.

Знач21 Знач22 Знач23
Знач11 1 1
Знач12 2
Знач13 1 3


Он отображает слева значения из столбца Текст1 в заголовке значения из столбца Текст2, а на пересечении считает count(id). Отчет строится за определенный интервал дат и может получиться так, что в этот промежуток каких то из значений не попало. ТОгда этот столбец иили строка не отображается, а нужно сделать так чтобы она отображалась. Например вот так

Знач21 Знач22 Знач23 Знач24
Знач11 1 1
Знач12 2
Знач13 1 3
Знач14 2
...
Рейтинг: 0 / 0
RS matrix отбражение столбцов даже при отсутсвии данных в этой области
    #39365782
Фотография user89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jeddite,

если за интервал дат, то я сначала строю таблицу с датами, затем cross join с периодом, а потом вешаю данные через left join. Для примера возьмем таблицу, где есть Февраль и Апрель, а надо вывести с Февраля по Май.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
set nocount on
set dateformat dmy
set language russian

declare @t table (projName varchar(10), projPeriod varchar(15), workHours int)
insert @t values ('Проект 1','Февраль 2016',120), ('Проект 1','Апрель 2016',150), ('Проект 2','Февраль 2016',140), ('Проект 2','Апрель 2016',200)
select * from @t

declare @dateBegin datetime = '01.02.2016', @dateEnd datetime = '31.05.2016'

;with num as (
  select 0 [n], year(dateadd(mm,0,@dateBegin)) [yy], month(dateadd(mm,0,@dateBegin)) [mm]
  union all
  select n+1, year(dateadd(mm,n+1,@dateBegin)) [yy], month(dateadd(mm,n+1,@dateBegin)) [mm]
  from num
  where n < datediff(mm,@dateBegin,@dateEnd)
), period as (
  select t.projName, num.yy, num.mm, datename(mm,str(10000*num.yy+100*num.mm+1)) + str(num.yy,5) [mname]
  from num
  cross join (select distinct projName from @t) t
)
select p.yy, p.mm, p.projName, p.mname, t.workHours
from period p
left join @t t on p.projName = t.projName and p.mname = projPeriod
order by p.projName, p.yy, p.mm


Репортинг в матрице развернет и отобразит выбранный нами период, даже с пустыми ячейками за Май месяц. Поля p.yy, p.mm нужны для правильной сортировки в отчете.
Здесь для получения последовательности дат, я использовал рекурсию , но лучше иметь готовую таблицу натуральных чисел 9911016
...
Рейтинг: 0 / 0
RS matrix отбражение столбцов даже при отсутсвии данных в этой области
    #39369047
jeddite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
user89,
я немного ошибся, мне не по датам нужно, а по датам и времени делать выборку, так же делать таблицу со всеми возможными вариантами времени?
...
Рейтинг: 0 / 0
RS matrix отбражение столбцов даже при отсутсвии данных в этой области
    #39369289
Фотография user89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jedditeuser89,
я немного ошибся, мне не по датам нужно, а по датам и времени делать выборку, так же делать таблицу со всеми возможными вариантами времени?Ага. Надо сделать все комбинации через cross join, а потом на эту сетку уже вешать данные через left join. Чтобы не было дубликатов, я в примере делал cross join через distinct.
...
Рейтинг: 0 / 0
RS matrix отбражение столбцов даже при отсутсвии данных в этой области
    #39371414
jeddite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
user89,
попробовал запрос, при увеличении интервала выдается сообщение :

Msg 530, Level 16, State 1, Line 11
Выполнение инструкции прервано. Максимальная рекурсия 100 была использована до завершения инструкции.

если я буду делать табличку с минутами на ближайшие лет 5, как победить эту ошибку?
...
Рейтинг: 0 / 0
RS matrix отбражение столбцов даже при отсутсвии данных в этой области
    #39371573
Фотография user89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jeddite,

Таблицу лучше сделайте, занимает очень мало места, а пригодится много раз
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
if object_id(N'integerNumbers','u') is not null drop table integerNumbers
go
Create table integerNumbers (num int)

insert integerNumbers
select n6.num*100000 + n5.num*10000 + n4.num*1000 + n3.num*100 + n2.num*10 + n1.num [num] -- Миллион записей от 0 до 999999
from
(select 0 as num union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7
 union all select 8 union all select 9) n1,
(select 0 as num union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7
 union all select 8 union all select 9) n2,
(select 0 as num union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7
 union all select 8 union all select 9) n3,
(select 0 as num union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7
 union all select 8 union all select 9) n4,
(select 0 as num union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7
 union all select 8 union all select 9) n5,
(select 0 as num union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7
 union all select 8 union all select 9) n6
order by 1

go
create clustered index IX_Num on integerNumbers (Num)
go

select * from integerNumbers
where num between 1 and 15


jedditeMsg 530, Level 16, State 1, Line 11
Выполнение инструкции прервано. Максимальная рекурсия 100 была использована до завершения инструкции.
если я буду делать табличку с минутами на ближайшие лет 5, как победить эту ошибку?Напишите в самом конце, даже после order by, такую фразу
Код: sql
1.
option (maxrecursion 0)

Примеров полно здесь на форуме и в гугле
Но если запрос написан с ошибкой, то выборка может уйти в вечный цикл....
...
Рейтинг: 0 / 0
RS matrix отбражение столбцов даже при отсутсвии данных в этой области
    #39374849
jeddite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
user89,

Я пока экспериментировал, у меня получилось сделать через union, столбцов и строк у меня не много, поэтому добавил просто нужные комбинации, а значение даты для этих записей в null установил. В select для матрицы добавил дополнительное условие через or date == NULL. Наверно не самый изящный способ, но работает....

Спасибо за помощь.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Отчетные системы [игнор отключен] [закрыт для гостей] / RS matrix отбражение столбцов даже при отсутсвии данных в этой области
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]