Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/03/2011, 16h05   #1
Invité de passage
 
Inscription : septembre 2009
Messages : 9
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 9
Points : 1
Points : 1
Par défaut Requête Taux de variation annuel moyen

Bonjour,

Je ne trouve pas le moyen de faire un taux de variation annuel moyen (par exemple de la population entre 1999 et 2007).

La formule est : Racine nième ((valeur 2007 - valeur 1999) / valeur 1999 ) (n étant le nombre d'année)

En SQL (sql server), j’exécute donc la requête :
Code :
1
2
3
SELECT 
POWER (sum(p.p07_pop)-sum(p.p99_pop), 1/8)AS 'Variation annuelle moyenne de la pop entre 1999 et 2007'
FROM matable AS p
car Racine nième = Puissance (1/n)

et j'obtiens 1 pour tous les enregistrements (p07_pop et p99_pop étant en real)

J'ai tenté la conversion :
Code :
convert(float ,POWER (sum(p.p07_pop)-sum(p.p99_pop), 1/8),2) AS 'Variation annuelle moyenne de la pop entre 1999 et 2007'
mais rien n'y fait, il me retourne toujours 1 !!!

Avez-vous des idées ?

Merci
damnn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 16h53   #2
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 520
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 520
Points : 3 967
Points : 3 967
pb de conversion de type ?

Que donne cette bidouille ?
Code :
1
2
3
SELECT
    POWER (sum(1.0*p.p07_pop)-sum(1.0*p.p99_pop), 1.0/8)AS 'Variation annuelle moyenne de la pop entre 1999 et 2007'
FROM matable AS p
Si, comme je crois, 1/8 est conservé comme un entier, ça donne 0.
Et quelque chose exposant 0 = 1...
__________________
les règles du forum - mode d'emploi du forum
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs.
(Rappel : "ça ne marche pas" n'est pas un message d'erreur)
JE NE RÉPONDS PAS aux questions techniques par message privé.
Écrire en français sur un forum est une marque minimale de respect.
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 19h47   #3
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 723
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 723
Points : 6 844
Points : 6 844
Tout à fait.

l'opération 1/8 donnera 0 ici car le résultat sera un entier.

POWER(X, 0) est toujours égale à 1.

7gyY9w1ZY6ySRgPeaefZ vous a donné la solution. Vous pouvez utiliser 1.0 / 8 ou 1. / 8 dans votre cas.

Attention également à ne pas avoir de valeurs négatives pour sum(1.0*p.p07_pop)-sum(1.0*p.p99_pop) car ceci engendrerait une erreur de ce type :

Code :
1
2
Msg 3623, Level 16, State 1, Line 10
An invalid floating point operation occurred.
++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 16h26   #4
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 953
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 953
Points : 17 773
Points : 17 773
Et pour le dernier cas soulevé par mikedavem il suffit de placer UN CASE et renvoyer NULL en cas de valeur négative.

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2011, 15h47   #5
Invité de passage
 
Inscription : septembre 2009
Messages : 9
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 9
Points : 1
Points : 1
MErci des réponses...

Par contre, avec cette requête :

Code sql :
POWER (nullif(sum(1.0*p.p07_pop)-sum(1.0*p.p99_pop),0), 1.0/8),2)

J'obtiens le message d'erreur :

Avertissement*: une erreur de domaine s'est produite.
Msg*0, Niveau*11, État*0, Ligne*0
Une erreur grave s'est produite sur la commande actuelle. Les résultats éventuels doivent être ignorés.


WTF ?
damnn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2011, 16h04   #6
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 520
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 520
Points : 3 967
Points : 3 967
que vaut ceci ?
Code :
sum(1.0*p.p07_pop)-sum(1.0*p.p99_pop)
__________________
les règles du forum - mode d'emploi du forum
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs.
(Rappel : "ça ne marche pas" n'est pas un message d'erreur)
JE NE RÉPONDS PAS aux questions techniques par message privé.
Écrire en français sur un forum est une marque minimale de respect.
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 09h28   #7
Invité de passage
 
Inscription : septembre 2009
Messages : 9
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 9
Points : 1
Points : 1
Code sql :
sum(1.0*p.p07_pop)-sum(1.0*p.p99_pop)

Ce code marche bien ... C'est la puissance inverse qui provoque ce message d'erreur ...

Pour info, quand je tente la requête sur un enregistrement (une commune), le résultat est bien renvoyé ... mais je dois mettre en place des sommes

Sinon, n'y a-t-il pas de syntaxe pour une racine nième (au lieu de passer par la puissance inverse) ?
damnn est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h07.


 
 
 
 
Partenaires

Hébergement Web