Bonjour, je dois mettre sous SQL un contrôle en prenant en compte les arrondis. En pj vous trouverez la description détaillé de la problématique et la règle de calcul a mettre en place.
Je ne vois pas trop la solution.
Merci de vos retours
Teddy
Bonjour, je dois mettre sous SQL un contrôle en prenant en compte les arrondis. En pj vous trouverez la description détaillé de la problématique et la règle de calcul a mettre en place.
Je ne vois pas trop la solution.
Merci de vos retours
Teddy
Ce n'est pas très compliqué : en une seule requête SQL vous pouvez arrondir, calculez les écarts et réaffecter le différentiel à l'écart max à l'aide d'un CASE ou d'une jointure externe....
Démo :
la table et ses valeurs :
La requête décomposée en CTE :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 CREATE TABLE T (ID INT IDENTITY PRIMARY KEY, VALEUR DECIMAL(16,2) NOT NULL); GO INSERT INTO T VALUES (9750), (5475), (2425); GO
Elle règle le cas ou il y a deux valeurs ex æquo candidates à la rectification....
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 WITH T_ARRONDI AS (SELECT *, ROUND(VALEUR/1000, 0) AS VALEUR_KEUROS, ROUND(SUM(VALEUR) OVER() /1000, 0) AS TOTAL_KEUROS FROM T), T_ECART AS (SELECT *, ABS(VALEUR - VALEUR_KEUROS * 1000) AS ECART_VALEUR, TOTAL_KEUROS - SUM(VALEUR_KEUROS) OVER() AS ECART_TOTAL FROM T_ARRONDI), T_ECART_RANG AS (SELECT ID, ECART_VALEUR, RANK() OVER(ORDER BY ECART_VALEUR DESC) AS RANG, COUNT(*) OVER(PARTITION BY ECART_VALEUR) AS NOMBRE FROM T_ECART) SELECT E.ID, VALEUR, VALEUR_KEUROS + COALESCE(ECART_TOTAL / NOMBRE, 0) AS TOTAL_KEUROS_RECTIFIE FROM T_ECART AS E LEFT OUTER JOIN T_ECART_RANG AS ER On E.ID = ER.ID AND RANG = 1
A +
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
* * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *
Bonjour merci bp de votre retour, mais lorsqu'on travaille sur la version SQL server 2008 cela ne fonctionne pas, en effet j'ai le message ci-dessous
Msg*156, Niveau*15, État*1, Ligne*3
Syntaxe incorrecte vers le mot clé 'WITH'.
Msg*156, Niveau*15, État*1, Ligne*5
Syntaxe incorrecte vers le mot clé 'OVER'.
Msg*156, Niveau*15, État*1, Ligne*9
Syntaxe incorrecte vers le mot clé 'OVER'.
Msg*195, Niveau*15, État*10, Ligne*12
'RANK' n'est pas un nom de fonction reconnu.
Msg*156, Niveau*15, État*1, Ligne*24
Syntaxe incorrecte vers le mot clé 'OVER'.
Merci de votre retour
Teddy
Merci bp mais je suis visiblement sur une version ancienne pas SQL Server 2008, du coup les fonctions over et rank ne sont pas reconnues.
Avez vous d'autres idées ?
Merci de votre retour
Teddy
Ça serait pas plus simple de nous fournir directement votre version ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part select @@version
Bonjour merci, voici le résultat de la requête
Microsoft SQL Server 2000 - 8.00.2039 (Intel X86) May 3 2005 23:18:38 Copyright (c) 1988-2003 Microsoft Corporation Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 1)
Merci
Teddy
Partager