Forums d'entraide informatique - Les forums de PCW

Version complète : [SQL Server 2k5 SSAS] Calcul Nommé
Vous consultez actuellement la version basse qualité d'un document. Voir la version complète avec le bon formatage.
Bonjour tout le monde !


Je ne sais pas si vous allez pouvoir m'aider, mais comme c'est toujours ici qu'on m'a le mieux répondu (et toujours en bon), autant essayer.

Pour information, je travaille sous SQL Server 2005 version Standard. Le but du calcul nommé, c'est d'avoir une colonne supplémentaire dans une table de fait nommée par exemple FAIT_Question, afin que celle-ci possède un élément agrégé plus rapidement calculé que lorsque l'on fait un membre calculé en MDX (du SQL multi dimensionnel) lorsque l'on parcourt le cube, sous excel par exemple.

La question est simple : faire des tests...

Premier test : ma valeur attendue est-elle vide ? (le NULL)
-> oui : NULL
-> non : Second test

Second Test : ma valeur attendue est-elle égale à 0 ?
-> oui : NULL
-> non : Dernier test

Dernier Test : ma valeur réelle est-elle vide ?
-> oui : NULL
-> non : réel / attendu





SELECT FAIT_Question,

IIF(
ISNULL([VALEUR_ATTENDUE]
,[DT-R8]),
NULL,

(IIF([VALEUR_ATTENDUE] == '0',
NULL ,

(IIF(
ISNULL(
[REEL],
[DT-R8]),
NULL,
[REEL]/[VALEUR_ATTENDUE])
)
))

)

AS C_TEST

FROM FAIT_Question AS FAIT_Question



Syntaxe générique :

SELECT <Table Name in Data Source>.* , <Expression> AS <Column Name> FROM <Table Name in Data Source> AS <Table Name in Data Source View>



Le IIF est la condition "IF then else" de forme IIF(condition,vrai,faux) que l'on retrouve aussi ailleurs en " condition ? vrai : faux" (sous SSIS par exemple)

L'erreur affichée par SQL Server est la suivante : "Syntaxe incorrecte vers '='."
Evidemment, j'ai testé au cas où du ='0', =0, ==0...mais non, rien n'y fait.

J'ai tenté de changer les IIF par des case sans succès

case when
ISNULL([VALEUR_ATTENDUE]
,[DT-R8]) then
NULL else

(case when [VALEUR_ATTENDUE] == '0' then
NULL else

(case when
ISNULL(
[REEL],
[DT-R8]) then
NULL else
[REEL]/[VALEUR_ATTENDUE]))




Au niveau comportemental, ce ne sera pas ce que je cherche puisqu'après le résultat que je veux est impossible à avoir par agrégat. (il faudrait un produit, or ce n'est pas faisable dans cette version)
Mais comme je n'aime pas rester sur un blocage...Et que ça pourra toujours servir un jour ou l'autre !


Si l'un de vous voit l'erreur, merci de la signaler Wink
Je continue de chercher de mon côté. Je tomberai bien sur un projet où ça servira Smile

Merci de m'avoir lu.


Dardadax

Bonsoir,

Essaies ceci :



SELECT FAIT_Question,

IIF(ISNULL([VALEUR_ATTENDUE],[DT-R8]),
NULL,
IIF(([VALEUR_ATTENDUE] == 0),
NULL ,
IIF( ISNULL([REEL], [DT-R8]),
NULL,
[REEL]/[VALEUR_ATTENDUE]
)
)
)

AS C_TEST

FROM FAIT_Question AS FAIT_Questio

Bonjour Troll !

Merci de ta réponse, je l'ai testé mais j'ai toujours le même message, à savoir :

Citation :TITRE : Microsoft Visual Studio
------------------------------

Impossible de terminer la préparation différée.
Impossible de préparer les instructions.
Syntaxe incorrecte vers '='.
Syntaxe incorrecte vers le mot clé 'SELECT'.

------------------------------
BOUTONS :

OK
------------------------------


Comme je l'avais dit dans le précédent message, j'avais tenté plusieurs options au niveau du "=", à savoir ='0', =0, ==0 (tous les mix possibles entre le simple et double "égal"


Je viens de trouver pour le problème du "=" Smile c'était bien une erreur "bête"...( j'ai remplacé par IN (mesValeurs))
Il y a encore quelques modifications(le ISNULL vient du SSIS...remplacé par IS NULL...) trouvées sur le net également.



SELECT

CASE WHEN [VALEUR_ATTENDUE] IS NULL
THEN NULL
ELSE CASE WHEN [VALEUR_ATTENDUE] IN (0)
THEN NULL
ELSE CASE WHEN [REEL] IS NULL
THEN NULL
ELSE [REEL]/[VALEUR_ATTENDUE]
END
END
END
AS C_TEST

FROM FAIT_Question



Résultat : une question dont je dois trouver la réponse...

A quoi sert (ou comment fonctionne) la fonction ISNULL ?... (puisque présent malgré tout mais nécessitant 2 arguments dans le T-SQL de chez Microsoft...)
Mais ça je pense le trouver tout seul.


Rappel :
mon expression mise plus haut s'insère dans la portion de code suivante :

Citation :SELECT FAIT_Question.* , <Expression> AS <Column Name> FROM FAIT_Question AS FAIT_Question


Petit détail qui a son importance : ça marche sur l'exécuteur de requête de SQL Server mais pas chez SSAS.

Je pense que le problème vient de la distinction <Table Name in Data Source> et <Table Name in Data Source View>...Je regarde de suite et éditerai une fois que ça marche.


Edit : aussi bizarre que cela puisse paraître, ça marche en requête nommée mais pas en calcul nommé...bizarre -_-'

En fait c'est un truc simple : via l'éditeur il faut juste mettre la définition du calcul... Donc ne pas suivre la démarche de Microsoft (peu complète) ne donnant que la formule de codage complète (non pas à saisir lol)


CASE	WHEN &amp;#91;VALEUR_ATTENDUE&amp;#93; IS NULL 
THEN NULL
ELSE CASE WHEN &amp;#91;VALEUR_ATTENDUE&amp;#93; IN &amp;#40;0&amp;#41;
THEN NULL
ELSE CASE WHEN &amp;#91;REEL&amp;#93; IS NULL
THEN NULL
ELSE &amp;#91;REEL&amp;#93;/&amp;#91;VALEUR_ATTENDUE&amp;#93;
END
END
END
AS C_TEST



Et hop un résolu !! ^^

Ah bah on était à côté de la plaquet et de la syntaxe Smile


Par contre est-ce normal que tu aies viré le SELECT ?
Salut Troll ^^

A côté de la plaque mais bon, comme du côté langage à choisir, le logiciel n'est pas très clair... lol

Oui j'ai viré le select parce que contrairement à ce qu'affiche l'aide...il ne faut insérer que le calcul de l'expression elle-même...(qu'il insère dans une requête SQL qui'il génère automatiquement !

En gros l'aide te dit : il faut faire l'instruction complète avec le select, mais la partie SSAS de création de calcul nommé ne veut que le "comment je la calcule, ta nouvelle colonne?"

ça marche donc c'est bon ^^ reste plus qu'à trouver l'occasion de l'utiliser Smile

d'après ce que j'ai pu voir un peu partout, les calculs nommés sont utilisés pour simplifier le calcul du cube en insérant "en dur" les valeurs que l'on utilise couramment, comme le prix TTC basé sur le prix HT et la TVA du pays par exemple...

résultat : un affichage plus rapide du résultat de la requête via excel (ou tout autre logiciel de reporting)

Pour ceux qui ne connaissent pas le principe, le cube est une sorte de stockage multidimmensionnel où tous les recouements entre tables sont précalculés.
Résultat : on n'exécute plus de requête (hors calculs d'agrégats) mais on parcourt le cube, ce qui revient à lire les données (beaucoup plus rapide en somme)


Marchenko.
Ok merci pour l'explication Wink
URLs de référence