Гость
Форумы / Отчетные системы [игнор отключен] [закрыт для гостей] / RS matrix отбражение столбцов даже при отсутсвии данных в этой области / 14 сообщений из 14, страница 1 из 1
11.10.2012, 13:28
    #37993618
Che0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RS matrix отбражение столбцов даже при отсутсвии данных в этой области
Добрый день.
Необходимо в 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
11.10.2012, 17:17
    #37994170
user89
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RS matrix отбражение столбцов даже при отсутсвии данных в этой области
Che0,

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

Возможно вместо inner join использовать Left Join
Или как-то хитро скобки в джойнах расставить.
Или через подзапрос...
...
Рейтинг: 0 / 0
11.10.2012, 18:56
    #37994384
Che0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RS matrix отбражение столбцов даже при отсутсвии данных в этой области
user89, в том то и дело что несмотря на то я использую full join все равно не выводит.
...
Рейтинг: 0 / 0
12.10.2012, 09:17
    #37994906
Andrews25
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RS matrix отбражение столбцов даже при отсутсвии данных в этой области
Che0,
у меня простой SQL - без SSAS
но наверно, проблема такая же
делаю так
допустим нужны данные по некому ID за все месяцы периода и месяцы - это колонки нашего отчета
я принудительно добавляю в результирующий dataset (в хранимой процедуре) данные за те нужные месяцы, когда данных нет НО С НУЛЕВЫМ ID и нулевыми значениями
строки, относящиеся к нулевому ID потом прямо в matrix делаю hidden про условию ID = 0
...
Рейтинг: 0 / 0
12.10.2012, 09:28
    #37994923
user89
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RS matrix отбражение столбцов даже при отсутсвии данных в этой области
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
12.10.2012, 11:01
    #37995142
Che0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RS matrix отбражение столбцов даже при отсутсвии данных в этой области
Andrews25,

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

в моем случае hide-ться вся строка
выбирается строка и в контекстном меню Row visibility
пишу условие для hidden =Fields!ID.Value = 0
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
12.12.2016, 23:08
    #39365299
jeddite
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RS matrix отбражение столбцов даже при отсутсвии данных в этой области
Всем привет!
Что-то из всего вышесказанного не понял как все таки сделать отображение в матрице полей для которых нет значений.
У меня есть таблица со столбцами 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
13.12.2016, 14:59
    #39365782
user89
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RS matrix отбражение столбцов даже при отсутсвии данных в этой области
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
16.12.2016, 22:49
    #39369047
jeddite
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RS matrix отбражение столбцов даже при отсутсвии данных в этой области
user89,
я немного ошибся, мне не по датам нужно, а по датам и времени делать выборку, так же делать таблицу со всеми возможными вариантами времени?
...
Рейтинг: 0 / 0
17.12.2016, 16:31
    #39369289
user89
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RS matrix отбражение столбцов даже при отсутсвии данных в этой области
jedditeuser89,
я немного ошибся, мне не по датам нужно, а по датам и времени делать выборку, так же делать таблицу со всеми возможными вариантами времени?Ага. Надо сделать все комбинации через cross join, а потом на эту сетку уже вешать данные через left join. Чтобы не было дубликатов, я в примере делал cross join через distinct.
...
Рейтинг: 0 / 0
20.12.2016, 22:17
    #39371414
jeddite
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RS matrix отбражение столбцов даже при отсутсвии данных в этой области
user89,
попробовал запрос, при увеличении интервала выдается сообщение :

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

если я буду делать табличку с минутами на ближайшие лет 5, как победить эту ошибку?
...
Рейтинг: 0 / 0
21.12.2016, 09:34
    #39371573
user89
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RS matrix отбражение столбцов даже при отсутсвии данных в этой области
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
25.12.2016, 19:10
    #39374849
jeddite
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RS matrix отбражение столбцов даже при отсутсвии данных в этой области
user89,

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

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


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