Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Requêtes et SQL.
Requêtes et SQL. Tout ce qui concerne vos questions sur les requêtes et le SQL sous Access se trouve ici.
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 08/11/2011, 12h06   #1
Membre habitué
 
Avatar de mioux
 
Inscription : novembre 2005
Messages : 319
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 319
Points : 103
Points : 103
Par défaut double pivot sans agrégat.

Bonjour.

Je suis confronté à un problème draconien. J'ai une base de données dont le schéma n'est pas du tout adapté à l'interface qui est collée dessus (une interface en VB.Net, que je développe également).

Le problème étant le suivant. Ma table enregistre des données en lignes. Ces mêmes données sont modifiées en colonnes sur l'interface de saisie.

J'ai donc un schéma de table comme ceci

Code :
1
2
3
4
5
6
ID => Numérique auto incrément, PK
BK1 => Texte ou int, membre de la clef métier
BK2 => Texte ou int, membre de la clef métier
YR => Int contenant l'année de la donnée, et qui fait partie de la clef métier sur laquelle on veut piviter
VAL1 => Première valeur (Double)
VAL2 => Deuxième valeur (Double)
Le tout dans 5 tables différentes, avec le nombre de colonnes valiables dans la clef métier (selon la table, pas dans une même table va de soit), et le nombre de valeur étant également variable (1 ou 2 selon la table).

Mon tableau de saisie quant à lui est en colonne, avec saisie par année

Code :
1
2
3
4
5
6
7
BK1 => Combbobox ou textbox
BK2 => Combobox ou textbox
VAL_YEAR0 => Valeur sur l'année de référence
VAL_YEAR1 => Valeur sur l'année + 1
VAL_YEAR2 => Valeur sur l'année + 2
VAL_YEAR3 => Valeur sur l'année + 3
...
Le datasource associé au tableau affiché contient en plus les ID des lignes affichées

Code :
1
2
3
4
5
6
7
BK1 => Int ou string
BK2 => Int ou string
VAL_YEAR0 => Double
ID_YEAR0 => Int
VAL_YEAR1 => Double
ID_YEAR1 => Int
...
Mon problème arrive lorsque l'utlisateur enregistre une clef métier en double. Oui c'est pas moi qui ai voulu ça, c'est une demande métier, je ne peux pas y couper, je ne peux pas interdire l'enregistrement si j'ai un couple BK1/BK2 en double. Je vais également préciser que non seulement c'est une demande métier, mais à l'origine du projet, il était IMPOSSIBLE de sauvegarder ces clefs en double.

C'est justement là qu'est mon problème. Lors de la lecture, pour pivoter les années, je somme les valeurs sur une même clef métier pour une année donnée. Pour récupérer les ID, je rajoute en union les ID des lignes qui sont concernées, puis ensuite, j'agrège le tout pour n'avoir qu'une ligne par clef métier.

Exemple concret
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
SELECT  LC.CurrencyCode, LC.UCM
        , SUM(YEAR_0) AS YEAR_0
        , SUM(YEAR_1) AS YEAR_1
        , SUM(YEAR_2) AS YEAR_2
        , SUM(YEAR_3) AS YEAR_3
        , SUM(YEAR_4) AS YEAR_4
        , SUM(YEAR_5) AS YEAR_5
        , SUM(YEAR_6) AS YEAR_6
        , SUM(YEAR_7) AS YEAR_7
        , SUM(YEAR_8) AS YEAR_8
        , SUM(YEAR_9) AS YEAR_9
        , SUM(YEAR_10) AS YEAR_10
        , SUM(YEAR_11) AS YEAR_11
        , MAX(ID_0) AS ID_0
        , MAX(ID_1) AS ID_1
        , MAX(ID_2) AS ID_2
        , MAX(ID_3) AS ID_3
        , MAX(ID_4) AS ID_4
        , MAX(ID_5) AS ID_5
FROM (
SELECT  LC.CurrencyCode, LC.UCM
        , Sum(LC.[Value_C] * (1-ABS(SGN(LC.[Year]-(2011)))))  AS Year_0
        , Sum(LC.[Value_T] * (1-ABS(SGN(LC.[Year]-(2011)))))  AS Year_6
        , 0 AS ID_0
        , Sum(LC.[Value_C] * (1-ABS(SGN(LC.[Year]-(2012)))))  AS Year_1
        , Sum(LC.[Value_T] * (1-ABS(SGN(LC.[Year]-(2012)))))  AS Year_7
        , 0 AS ID_1
        , Sum(LC.[Value_C] * (1-ABS(SGN(LC.[Year]-(2013)))))  AS Year_2
        , Sum(LC.[Value_T] * (1-ABS(SGN(LC.[Year]-(2013)))))  AS Year_8
        , 0 AS ID_2
        , Sum(LC.[Value_C] * (1-ABS(SGN(LC.[Year]-(2014)))))  AS Year_3
        , Sum(LC.[Value_T] * (1-ABS(SGN(LC.[Year]-(2014)))))  AS Year_9
        , 0 AS ID_3
        , Sum(LC.[Value_C] * (1-ABS(SGN(LC.[Year]-(2015)))))  AS Year_4
        , Sum(LC.[Value_T] * (1-ABS(SGN(LC.[Year]-(2015)))))  AS Year_10
        , 0 AS ID_4
        , Sum(LC.[Value_C] * (1-ABS(SGN(LC.[Year]-(2016)))))  AS Year_5
        , Sum(LC.[Value_T] * (1-ABS(SGN(LC.[Year]-(2016)))))  AS Year_11
        , 0 AS ID_5
FROM    TB0011_CUSTOM_LOGISTIC_COST AS LC
GROUP BY LC.CurrencyCode, LC.UCM
UNION ALL
SELECT  LC.CurrencyCode, LC.UCM
        , NULL
        , NULL
        , IIF([Year] = 2011, LC.Id, NULL)
        , NULL
        , NULL
        , IIF([Year] = 2012, LC.Id, NULL)
        , NULL
        , NULL
        , IIF([Year] = 2013, LC.Id, NULL)
        , NULL
        , NULL
        , IIF([Year] = 2014, LC.Id, NULL)
        , NULL
        , NULL
        , IIF([Year] = 2015, LC.Id, NULL)
        , NULL
        , NULL
        , IIF([Year] = 2016, LC.Id, NULL)
FROM    TB0011 AS LC
) AS TB
GROUP BY LC.CurrencyCode, LC.UCM
ORDER BY LC.UCM, LC.CurrencyCode;
Seulement, je voudrais sortir l'ensemble des lignes avec l'ensemble des données, et leurs ID correspondant, et là, si une clef métier est doublée, je ne sort qu'une ligne, avec la somme des données correspondant à la clef métier (qui ici est composée de LC.CurrencyCode, LC.UCM et de LC.YEAR (oui les noms de colonnes ne sont pas de moi non plus, jamais je n'aurais mis de YEAR et de VALUE)), le tout avec l'ID de la ligne le plus fort qui correspond à la clef métier. Or moi, je voudrais 2 lignes, chacune avec son couple CurrencyCode/UCM, et les données pivotées des années/ID correspondant à la ligne.

PS : La structure de la table
Code :
1
2
3
4
5
6
7
ID => NuméroAuto (membre du pivot)
ComponentId => Entier (inutile ici, car filtré, j'ai retiré une jointure)
UCM => Texte (Clef métier)
CurrencyCode => Texte (Clef métier)
Year => Entier (Clef métier, membre du pivot)
Value_C => Double (valeur 1 du pivot)
Value_T => Double (valeur 2 du pivot)
PPS : Je n'ai le droit ni aux vues, ni aux procédures stockées et il faut que l'exécution soit le plus rapide possible, vu que la requête est exécutée à chaque changement d'item.
mioux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/11/2011, 09h33   #2
Membre habitué
 
Avatar de mioux
 
Inscription : novembre 2005
Messages : 319
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 319
Points : 103
Points : 103
Bon après s'être torturé pendant plusieurs jours, la solution que l'on va mettre en oeuvre est de rajouter un champ caché dans l'application avec une colonne BusinessKey, gérée entièrement côté code, et qui, pour une "ligne" de saisie affecte un numéro aléatoire identique sur chaque ligne de la base de données. Ainsi quand je fais mon pivot, j'ai une colonne de plus, et ma clef métier est unique.
mioux est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h22.


 
 
 
 
Partenaires

Hébergement Web