2014-05-09 3 views
3

J'essaie de créer une requête qui sélectionne les 10 meilleurs produits (avec le plus de likes) créés par des utilisateurs âgés de 1 à 20 ans, à l'année 2014. Je suis en train d'utiliser la requête suivante:Requête MDX avec attribut de dimension entre deux valeurs et un autre attribut de dimension égal à une autre valeur

WITH SET [TopProducts] AS TOPCOUNT([Products].[Name].Members,10,[Measures].[Likes]) 
SELECT {[Measures].[Likes]} 
ON COLUMNS, {[TopProducts]} 
ON ROWS FROM [Likes] 
WHERE (
    {[Ages].[Age].[1]:[Ages].[Age].[24]}, 
    [Date].[Year].[2014] 
) 

Cette requête renvoie une erreur: No function matches signature '(<Set>, <Member>)'

Si je retire la [Date.Date].[Year].[2014] de la requête, il fonctionne bien, donc je pense que le problème est dans la formulation de la clause where. Qu'est-ce que je fais mal ici? Est-ce le moyen de faire cette requête?

Merci

Répondre

2

Dans la clause WHERE, vous devez spécifier un Tuple. Un Tuple est un ensemble non ordonné de membres d'une ou plusieurs dimensions.

essayer ceci:

WITH 
    SET [TopProducts] AS TOPCOUNT([Products].[Name].Members,10,[Measures].[Likes]) 
    MEMBER [Ages].[Range] as Aggregate([Ages].[Age].[1]:[Ages].[Age].[24]) 
SELECT {[Measures].[Likes]} 
    ON COLUMNS, {[TopProducts]} 
    ON ROWS FROM [Likes] 
WHERE ([Ages].[Range], [Date].[Year].[2014]) 

la fonction d'agrégation prend un ensemble et retourne un élément qui est l'agrégation de tous les éléments de l'ensemble. Maintenant, votre tuple sur la clause WHERE est correct, car il référence deux membres de deux dimensions différentes. membre

+0

Veuillez pardonner le mauvais phrasé de la première phrase. – nsousa

-1

Votre prédicat trancheuse essaie de faire une CrossProduct d'un ensemble et un membre. Ce n'est pas possible.

Ajouter des parenthèses ('{' & '}') autour du membre de date pour le transformer en un ensemble d'un membre. Il deviendra un prédicat composé qui comprend vos deux ensembles.

WITH SET [TopProducts] AS TOPCOUNT([Products].[Name].Members,10,[Measures].[Likes]) 
SELECT {[Measures].[Likes]} 
ON COLUMNS, {[TopProducts]} 
ON ROWS FROM [Likes] 
WHERE (
    {[Ages].[Age].[1]:[Ages].[Age].[24]} * 
    {[Date].[Year].[2014]} 
) 
+0

est logique, mais maintenant Lance cette erreur: "Aucune fonction ne correspond à la signature" (, ) '" – JPHorta

+1

J'ai corrigé une petite erreur, l'astérisque est l'opérateur qui devait être utilisé pour joindre deux ensembles, pas la virgule. en utilisant la solution par nsousa ci-dessus, il est plus facile pour les moteurs olap d'optimiser les ensembles en tant qu'ensembles calculés puisqu'ils peuvent être évalués séparément – Luc

0

UTILISATION CROSS JOIN crée toutes les combinaisons du « direct » et les dates dans ma gamme comme tuples pour ma WHERE trancheuse. Je pense que c'est la bonne réponse.

WITH SET [TopProducts] AS TOPCOUNT([Products].[Name].Members,10,[Measures]. 
[Likes]) 
SELECT {[Measures].[Likes]} 
ON COLUMNS, {[TopProducts]} 
ON ROWS FROM [Likes] 
WHERE CROSSJOIN([Date].[Year].[2014],{[Ages].[Age].[1]:[Ages].[Age].[24]}) 
Questions connexes