2016-06-30 1 views
0

Voici mon schéma de cube OLAPMDX: Les dix premiers d'une dimension basée sur la mesure

<?xml version="1.0"?> 
<Schema name="mySchema"> 
    <Cube name="myCube"> 
     <Table name="fact_access_logs_views"/> 
     <Dimension name="Countries" foreignKey="country_code_id"> 
      <Hierarchy hasAll="true" primaryKey="country_code_id"> 
       <Table name="dim_country_code"/> 
       <Level name="CountryCodes" column="CountryCode" uniqueMembers="false"/> 
      </Hierarchy> 
     </Dimension> 
     <Dimension name="Channels" foreignKey="channel_id"> 
      <Hierarchy hasAll="true" primaryKey="channel_id"> 
       <Table name="dim_channel"/> 
       <Level name="Channels" column="shortname_chn" uniqueMembers="false"/> 
      </Hierarchy> 
     </Dimension> 
     <Dimension name="Time" foreignKey="access_time_id"> 
      <Hierarchy hasAll="true" primaryKey="access_time_id"> 
       <Table name="dim_time_access"/> 
       <Level name="Year" column="Year" uniqueMembers="false"/> 
       <Level name="Month" column="Month" uniqueMembers="false"/> 
       <Level name="Date" column="Date" uniqueMembers="false"/> 
       <Level name="Hour" column="Hour" uniqueMembers="false"/> 
      </Hierarchy> 
     </Dimension> 
     <Measure name="View Count" column="id" aggregator="count" formatString="#,###"/> 
    </Cube> 
</Schema> 

ce que je suis en train de faire est de trouver dix pays sur la base du nombre de vues et plus dans chaque pays, les dix chaînes visionnées. Aidez-moi à construire une requête MDX. J'ai essayé de suivre ce https://msdn.microsoft.com/en-us/library/ms145579 mais a fini par obtenir des erreurs tout en regardant le cube.

Répondre

-1

Vous pouvez y parvenir en utilisant Top Count, Générer et CrossJoin.

WITH 
    SET TEMP AS 
     'Generate(TopCount([Countries].[CountryCodes].Members, 
     10, 
     [Measures].[View Count]), 
     Crossjoin(
      {[CountryCodes].CurrentMember}, 
      TopCount(
       [Channels].[Channels].Members, 
       10, [Measures].[View Count]) 
      ) 
     )' 

select {[Measures].[View Count]} ON COLUMNS, 
[TEMP] ON ROWS 
from [myCube] 
+0

Oo comment cela est différent de ma réponse ?? – mxix

+0

@mxix Votre réponse n'a pas fonctionné, vous n'avez pas utilisé la jointure croisée. – user3602022

+0

si vous utilisez SSAS sql-server. Ça marche. Avec ou sans le crossjoin explicite. Aucun problème. – mxix

1

Avec TopCount et Generate vous pouvez le faire comme ceci. TopCount vous donnera les meilleurs membres commandés par votre mesure de choix

Top 10 pays par Vues:

TopCount([Countries].[CountryCode].[CountryCode],10 ,[Measures].[View Count] ) 

Ensuite, vous itérez avec générer et currentmember le premier ensemble de Top pays Et gettting le Top canaux en utilisant la même logique ci-dessus, mais pour le canal.

WITH 
    SET TOPCHANNELSperTOPCOUNTRY AS 
    Generate 
    (
     TopCount 
     (
     [Countries].[CountryCode].[CountryCode] 
     ,10 
     ,[Measures].[View Count] 
    ) 
    ,TopCount 
     (
     (
      [Countries].[CountryCode].CurrentMember 
     ,[Channels].[Channels].[Channels] 
     ) 
     ,10 
     ,[Measures].[View Count] 
    ) 
    ) 
SELECT 
    [Measures].[View Count] ON 0 
,TOPCHANNELSperTOPCOUNTRY ON 1 
FROM [myCube]; 

(Désolé si certains noms de dimension ou les membres sont incorrects) ...

+0

(si vous utilisez 'MDXStudio' - il est libre - il a un bouton' format' qui est très utile) – whytheq