powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / WHERE ???
29 сообщений из 29, показаны все 2 страниц
WHERE ???
    #32802618
гуест3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Насколько я понимаю, когда задаешь несколько условий в WHERE они действуют на возвращаемый результат, сочетаясь по "и". Можно ли как-нибудь сделать, чтобы они сочетались по "или" ?

З.Ы. Извините за косноязычность ...
...
Рейтинг: 0 / 0
WHERE ???
    #32802806
No Pasaran
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если речь про sql, то конечно можно: where A or B

Если речь про какую-то определенную OLAP-плтаформу, то неплохо было бы ее указать в вопросе %)
...
Рейтинг: 0 / 0
WHERE ???
    #32802830
гуест3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сорри, я про MDX
...
Рейтинг: 0 / 0
WHERE ???
    #32804861
гуест3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MS AS
...
Рейтинг: 0 / 0
WHERE ???
    #32805425
олапист
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
идеологически MDX запрос всего лишь определяет множество ячеек куба которые нужно включить в результат
соответственно все сочетания ячеек по и/или должны быть определены в кубе, например путем создания дополнительных иерархий
...
Рейтинг: 0 / 0
WHERE ???
    #32806727
Владимир Штепа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
олапистидеологически MDX запрос всего лишь определяет множество ячеек куба которые нужно включить в результат
соответственно все сочетания ячеек по и/или должны быть определены в кубе, например путем создания дополнительных иерархий

иерархия и аггрегация по определению являются "И",
а вот "ИЛИ" в МДХ, мне так кажется, можно достигуть только извратом.
в том же SQL приводит в 99% к table scan.
...
Рейтинг: 0 / 0
WHERE ???
    #32806906
ShIgor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А по-моему не туда мы смотрим...
По определению, операции "и" и "или" предполагают наличие нескольких операций сравнения. Если предположить, что указание конкретного члена измерения это операция сравнения на равенство, то поставленный вопрос можно перефразировать так:
"Можно-ли во WHERE перечислить несколько членов одного измерения?" - ответ:
Нет, т.к. WHERE используется для создания срезов (slice) и в отличие от осей, которые возвращают данные для нескольких членов, WHERE возвращает данные для одного члена каждого измерения . Для всех не определенных во WHERE измерениях (отсутствие WHERE - частный случай этого) используются DefaultMember.
...
Рейтинг: 0 / 0
WHERE ???
    #32807046
Mosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В Юконе можно задать условие ИЛИ в WHERE clause указав там не tuple а set.

Моша
----------------------------------------------------
This posting is provided "AS IS" with no warranties, and confers no rights
...
Рейтинг: 0 / 0
WHERE ???
    #32807159
Владимир Штепа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MoshaВ Юконе можно задать условие ИЛИ в WHERE clause указав там не tuple а set.

Моша
----------------------------------------------------
This posting is provided "AS IS" with no warranties, and confers no rights

Это то понятно, если ИЛИ между членами одного измерения, а если надо что то вроде

select customers.members on 0,
products.members on 1
where time.2004 OR country.USA

???
...
Рейтинг: 0 / 0
WHERE ???
    #32807250
Mosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
backfireЭто то понятно, если ИЛИ между членами одного измерения, а если надо что то вроде

select customers.members on 0,
products.members on 1
where time.2004 OR country.USA
Нет никакой разницы - будь это члены одной иерархии или разных, все равно set in WHERE clause.

Моша
----------------------------------------------------
This posting is provided "AS IS" with no warranties, and confers no rights
...
Рейтинг: 0 / 0
WHERE ???
    #32807330
Владимир Штепа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
backfire

select customers.members on 0,
products.members on 1
where time.2004 OR country.USA

???

то я бы сделал это приблизительно так

with member time.mymember as SUM({(time.2004, country.All),(time.All, country.USA)})
// что равносильно
// with member country.mymember as SUM({(time.2004, country.All),(time.All, country.USA)})
select customers.members on 0,
products.members on 1
where time.mymember
...
Рейтинг: 0 / 0
WHERE ???
    #32807333
Владимир Штепа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mosha backfireЭто то понятно, если ИЛИ между членами одного измерения, а если надо что то вроде

select customers.members on 0,
products.members on 1
where time.2004 OR country.USA
Нет никакой разницы - будь это члены одной иерархии или разных, все равно set in WHERE clause.

Моша
----------------------------------------------------
This posting is provided "AS IS" with no warranties, and confers no rights


а примерчик в терминах Юкона и образцовой базы можно?
...
Рейтинг: 0 / 0
WHERE ???
    #32807339
ShIgor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В хэлпе на MSAS 2000 тоже дан пример:
Код: plaintext
WHERE { ([Time].[1st half], [Route].[nonground]), ([Time].[1st half], [Route].[ground]) }
однако замечено, что будет предпринята попытка агрегирования, однако если результатом будет не tuple, то произойдет ошибка.
Я попытался это проделать - у меня не получилось.
...
Рейтинг: 0 / 0
WHERE ???
    #32807340
Владимир Штепа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
backfire backfire

select customers.members on 0,
products.members on 1
where time.2004 OR country.USA

???

правильно так (и не только для Юкона)

with member time.mymember as 'SUM({(time.2004, country.All),(time.All, country.USA)}) - (time.2004, country.USA)'
// что равносильно
// with member country.mymember as 'SUM({(time.2004, country.All),(time.All, country.USA)}) - (time.2004, country.USA)'
select customers.members on 0,
products.members on 1
where time.mymember
...
Рейтинг: 0 / 0
WHERE ???
    #32807346
Mosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пример можно дать и в терминах AS2K - построение set в MDX не меняется, разница только заключается в том, что в AS2K этот set надо вставлять внутрь Aggregate который сидит на calculated member, а в Юконе set напрямую может идти в WHERE clause.
Set может выглядеть например так:

Код: plaintext
{(Time.[ 2004 ], Country.[All Contries]), (Time.[All Times], Country.USA)}

Моша
----------------------------------------------------
This posting is provided "AS IS" with no warranties, and confers no rights
...
Рейтинг: 0 / 0
WHERE ???
    #32807349
Владимир Штепа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShIgorВ хэлпе на MSAS 2000 тоже дан пример:
Код: plaintext
WHERE { ([Time].[1st half], [Route].[nonground]), ([Time].[1st half], [Route].[ground]) }
однако замечено, что будет предпринята попытка агрегирования, однако если результатом будет не tuple, то произойдет ошибка.
Я попытался это проделать - у меня не получилось.

пожалуйста, нельзя ли более точную ссылку на BOL

даю голову на отсечение, что этот пример вызывает синтаксическую ошибку в AS2K, ибо там под WHERE может быть только tuple.
...
Рейтинг: 0 / 0
WHERE ???
    #32807352
Mosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ShigorВ хэлпе на MSAS 2000 тоже дан пример:
Этот пример вряд ли из help AS2K, скорее он из спецификации OLEDB for OLAP

backfire'SUM({(time.2004, country.All),(time.All, country.USA)}) - (time.2004, country.USA
А зачем делать минус ?

Моша
----------------------------------------------------
This posting is provided "AS IS" with no warranties, and confers no rights
...
Рейтинг: 0 / 0
WHERE ???
    #32807359
ShIgor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
mk:@MSITStore:C:\Program%20Files\Microsoft%20SQL%20Server\ 80 \Tools\Books\olapdmad.chm::/agmdxbasics_6him.htm

но я же написал, что у меня это не получилось, може потому, что в примере
измерение [Route] состоит из 2х членов и оно явно преобразуется в tuple, у меня же таких нет :(
...
Рейтинг: 0 / 0
WHERE ???
    #32807371
Mosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все таки наши BOL это что-то, сразу после этого примера там написано:
If the «slicer_specification» cannot be resolved into a single tuple, an error will occur.Зачем тогда было давать такой пример...

Моша
----------------------------------------------------
This posting is provided "AS IS" with no warranties, and confers no rights
...
Рейтинг: 0 / 0
WHERE ???
    #32807376
Владимир Штепа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mosha ShigorВ хэлпе на MSAS 2000 тоже дан пример:
Этот пример вряд ли из help AS2K, скорее он из спецификации OLEDB for OLAP

backfire'SUM({(time.2004, country.All),(time.All, country.USA)}) - (time.2004, country.USA
А зачем делать минус ?

Моша
----------------------------------------------------
This posting is provided "AS IS" with no warranties, and confers no rights

а потому что

SUM({(time.2004, country.All),(time.All, country.USA)}) считает дважды

(time.2004, country.USA)

или я смешу ваши тапочки? :-)
...
Рейтинг: 0 / 0
WHERE ???
    #32807386
Владимир Штепа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MoshaВсе таки наши BOL это что-то, сразу после этого примера там написано:
If the «slicer_specification» cannot be resolved into a single tuple, an error will occur.Зачем тогда было давать такой пример...

Моша
----------------------------------------------------
This posting is provided "AS IS" with no warranties, and confers no rights

очень приятно слышать самокритику из ваших уст :-)
...
Рейтинг: 0 / 0
WHERE ???
    #32807419
Mosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
backfireа потому что
SUM({(time.2004, country.All),(time.All, country.USA)}) считает дважды
(time.2004, country.USA)
Да, я совсем забыл что в AS2K он действительно посчитает пересечение дважды, в Юконе set in the WHERE clause посчитает все один раз как и надо, да и функция Aggregate тоже (хотя в Beta 2 это еще не подключено). Вычитание пересечения становится непрактичным, когда количество измерений растет - там надо начинать компенсировать компенсации и т.д. - именно поэтому в Юконе мы сами автоматически убираем дупликаты.

Моша
----------------------------------------------------
This posting is provided "AS IS" with no warranties, and confers no rights
...
Рейтинг: 0 / 0
WHERE ???
    #32807692
Владимир Штепа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Moshaи т.д. - именно поэтому в Юконе мы сами автоматически убираем дупликаты.


Ну и хорошо :-))
- можно будет спокойно занятся прикладными задачами, а не потеть над реализацией алгебры множеств при генерации MDX.
...
Рейтинг: 0 / 0
WHERE ???
    #32825856
Владимир Штепа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mosha[quot backfire]
Да, я совсем забыл что в AS2K он действительно посчитает пересечение дважды, в Юконе set in the WHERE clause посчитает все один раз как и надо, да и функция Aggregate тоже (хотя в Beta 2 это еще не подключено). Вычитание пересечения становится непрактичным, когда количество измерений растет - там надо начинать компенсировать компенсации и т.д. - именно поэтому в Юконе мы сами автоматически убираем дупликаты.



Пока что все выглядет достаточно удручающе в королевстве Юкона :-(

- поведение AGGREGATE как и AS2K (необходимо вводить компенсацию)
- поведение SET под WHERE вообще не поддается обьяснению

нижеприведенные запросы отрабатывались в декабрьском билде Юкона (9.0.951)

Код: plaintext
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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
-- Query 0
select 
{
	[Product].[Product Categories].[All], 
	[Product].[Product Categories].[All].children
} on  0 ,

crossjoin(
	{
		[Customer].[Customer Geography].[All Customers], 
		[Customer].[Customer Geography].[All Customers].children
	}, 
	{
		[Measures].[Internet Sales Amount], 
		[Measures].[Internet Order Count]
	}
) on  1 
from [Direct Sales]


-- Query 1
with 
set set1 as 
{
	(
		[Product].[Product Categories].[Category].&[ 3 ], 
		[Customer].[Customer Geography].[All Customers]
	),
	(
		[Product].[Product Categories].[All], 
		[Customer].[Customer Geography].[Country-Region].&[Australia])
}
-- Двойной учет
--member [Product].[Product Categories].[MyMember] as AGGREGATE(set1, [Measures].currentmember)  

-- А так правильно
member [Product].[Product Categories].[MyMember] as 
 AGGREGATE(set1, [Measures].currentmember) - 
 ([Product].[Product Categories].[Category].&[ 3 ], 
  [Customer].[Customer Geography].[Country-Region].&[Australia], [Measures].currentmember)

select 
{[Measures].[Internet Sales Amount], [Measures].[Internet Order Count]} on  0 
from [Direct Sales]
where [Product].[Product Categories].[MyMember]

-- Query 2 (ни поведение ни результат не понятен, короче не то что хотелось :-(
select 
{[Measures].[Internet Sales Amount], [Measures].[Internet Order Count]} on  0 
from [Direct Sales]
where
{
	(
		[Product].[Product Categories].[Category].&[ 3 ], 
		[Customer].[Customer Geography].[All Customers]
	),
	(
		[Product].[Product Categories].[All], 
		[Customer].[Customer Geography].[Country-Region].&[Australia])
}
...
Рейтинг: 0 / 0
WHERE ???
    #32825882
Mosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо backfire, это интересный баг связанный с использованием перспективы вместо куба в FROM clause. (Перспектива [Direct Sales], которая не имеет всех measures, накладывается на "неровный" set in WHERE clause и выдает ошибку - мы ее уже чиним :). Если использовать настоющий куб [Adventure Works], то все работает как следует:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select 
{[Measures].[Internet Sales Amount]} on  0 
from [Adventure Works]
where
{
	(
		[Product].[Product Categories].[Category].&[ 3 ], 
		[Customer].[Customer Geography].[All Customers]
	),
	(
		[Product].[Product Categories].[All], 
		[Customer].[Customer Geography].[Country-Region].&[Australia]
                )
}

Дает правильный ответ. Что касается Aggregate - то попробуйте Ваш set с DistinctCount measure - никакого double counting быть не должно. Для других measures, в CTP build включен старый алгоритм, как я уже писал в другом thread, пока ломать backward compatibility ради производительности не дают, поэтому новый код который убирает дупликаты не включен.

Моша
----------------------------------------------------
This posting is provided "AS IS" with no warranties, and confers no rights
...
Рейтинг: 0 / 0
WHERE ???
    #32826134
Владимир Штепа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У Вас работает правильно, а я вообще низвесно что тестирую :-(

Как я выяснил, на MSDN, под видом декабрьского CTP в начале декабря лежал совсем не декабрьский :-(.

А я так старательно на нем тестировал :-(



Кстати я выяснил еще одно странное поведение. Упоминание неизвестного члена, не выдает ошибку, а считает как ни в чем не бывало. Неужели это "by design"?

Например это запрос, отрабатывает, как будто where вообще в нем не присутствует.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
// Query  1 
with 
set set1 as 
{
	(
		[Product].[Product Categories].[Category].&[ 3 ], 
		[Customer].[Customer Geography].[All Customers]
	),
	(
		[Product].[Product Categories].[All], 
		[Customer].[Customer Geography].[Country-Region].&[Australia])
}

member [Product].[Product Categories].[MyMember] as 
 AGGREGATE(set1, [Measures].currentmember) - 
 ([Product].[Product Categories].[Category].&[ 3 ], 
 [Customer].[Customer Geography].[Country-Region].&[Australia], [Measures].currentmember)

select 
{[Measures].[Internet Sales Amount], [Measures].[Internet Order Count]} on  0 
from [Adventure Works]
where [Product].[Product Categories].[NotMyMember]
...
Рейтинг: 0 / 0
WHERE ???
    #32826153
Владимир Штепа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MoshaЧто касается Aggregate - то попробуйте Ваш set с DistinctCount measure - никакого double counting быть не должно. Для других measures, в CTP build включен старый алгоритм, как я уже писал в другом thread, пока ломать backward compatibility ради производительности не дают, поэтому новый код который убирает дупликаты не включен.

Я знаю, что с DistinctCount все OK. А вот для нормальных мер, это еще вопрос, что считать правильным. Как вы уже заметили ранне, правильнее было бы исключать на уровне MDX-Engine, двойной учет, а не корячится на уровне прикладного MDX.
...
Рейтинг: 0 / 0
WHERE ???
    #32826202
Mosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
backfireКстати я выяснил еще одно странное поведение. Упоминание неизвестного члена, не выдает ошибку, а считает как ни в чем не бывало. Неужели это "by design"?
Вообще-то это новая фича, но уже куча народа жалуется :) Мы хотели как в SQL - если в WHERE condition набрал неправильное имя - то не ошибку, а игнорировать, т.е. WHERE City='NoSuchCity' в SQL это не ошибка. Ну мы сделали новое свойство измерения - MdxMissingMemberMode - его можно посмотреть в dimension properties, которое говорит поднимать ошибку или нет. По умолчанию не поднимать. Сейчас у меня DCR на основе жалоб от людей которым это не понравилось - например внутри MDX Script - всегда будет ошибка, плюс connection string property для контроля. А Вы что по этому поводу думаете ?

backfireНапример это запрос, отрабатывает, как будто where вообще в нем не присутствует.
А это баг,про который мы знаем - если WHERE clause пустое, то надо вернуть пустой результат а не игнорировать. Вот Ира вернется из отпуска и починит.

Моша
----------------------------------------------------
This posting is provided "AS IS" with no warranties, and confers no rights
...
Рейтинг: 0 / 0
WHERE ???
    #32826325
Владимир Штепа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MoshaВообще-то это новая фича, но уже куча народа жалуется :) Мы хотели как в SQL - если в WHERE condition набрал неправильное имя - то не ошибку, а игнорировать, т.е. WHERE City='NoSuchCity' в SQL это не ошибка. Ну мы сделали новое свойство измерения - MdxMissingMemberMode - его можно посмотреть в dimension properties, которое говорит поднимать ошибку или нет. По умолчанию не поднимать. Сейчас у меня DCR на основе жалоб от людей которым это не понравилось - например внутри MDX Script - всегда будет ошибка, плюс connection string property для контроля. А Вы что по этому поводу думаете ?


Я думаю что с SQL можно было бы сравнивать выражение типа

Customer.CurrentMember.UniqueName = "NoSuchSity",

а в MDX Customer.NoSuchCity есть объект (базы данных), а не строка.
И обращение к свойствам несуществующих объектов должно давать NullReferenceException, (в SQL упоминание несуществующих столбцов тоже дает ошибку)

Кстати, в AS2005 есть еще один, как мне кажется, баг.
Если кого то угораздит обозвать Calculated Member именем существующего физического элемента, то в AS2K мы получим ошибку с четким изложением причины, а в AS2005 выдастся результат для существующего физического члена.

Подытоживая: наличие фишек в языке, которые ведут в результате описок не к ошибкам времени исполнения, а к нежелательному результату, сильно усложняет отладку и удорожает разработку.
...
Рейтинг: 0 / 0
29 сообщений из 29, показаны все 2 страниц
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / WHERE ???
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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