|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : février 2011 Messages : 32 ![]() |
Bonjour,
Dans le cadre de mon projet sur sqlserver, j'ai une table composé de 4 colonnes. La première A colonne contient 4 valeurs:de 1 jusqu'à 4. La deuxième colonne B contient 5 valeurs: de 1 jusqu'à' à 4 avec la valeur NULL. La troisième colonne C contient 5 valeurs: de 1 jusqu'à' à 4 avec la valeur NULL. Dans la 4eme colonne "combinaison", il faut créer une combinaison entre les colonnes A,B,C. exemple 1 ere valeur 1 c'est la combinaison 1, null,null 2 eme valeur c'est la combinaison 2,1,null. J'ai pensé a créer une procédure qui met a jour la colonne combinaison. voici l'idée: For(i=1;i<4;i++) For(j=1;i<5;j++) For(k=1;i<5;k++) et après update table set valeur++. J'ai 2 problèmes: 1 La syntaxe:je n'arrive pas à créer cette procédure 2 valeur nul:Comment gérer les valeurs null alors que le compteur commence de 1 Merci de me proposer des solutions ou de corrections. MERCI |
|
|
00
|
|
|
#2 | ||||||||||||||
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 667 ![]() |
Bonjour,
Citation:
Celle-ci dicte que toute valeur stockée dans une colonne doit être atomique. Si vous faites donc le contraire, vous partirez dans des requêtes tordues et longues et difficiles à écrire, en plus d'être bien évidemment contre-performantes. Citation:
Dans un langage fonctionnel, vous écrivez comment vous voulez arriver à un résultat. SQL est un langage déclaratif, donc vous lui dictez ce que vous voulez, et le moteur de bases de données le reste. D'autre part SQL est un langage ensembliste, puisqu'il est fondé sur la théorie des ensembles. En conséquence un bout de code qui serait traduit en SQL à partir de : Code :
Citation:
Citation:
D'aileurs si vous exécutez : Code :
Vous pouvez essayer tout autre opérateur arithmétique, vous obtiendrez toujours le même résultat. Donc pour calculer toutes les combinaisons dont vous avez besoin, on peut créer la table suivante : Code :
Code :
Pour chacune d'entre-elles, je les peuple avec les valeurs de votre énoncé. Ensuite j’effectue un produit cartésien introduit par CROSS JOIN. Donc si par exemple j'ai 4 valeurs dans A et 2 valeurs dans B, j'aurai 8 lignes. Comme j'ai 4 valeurs dans A et 5 dans B, j'en ai 20. Ensuite comme le jeu de valeurs de C est le même que B, je le réutilise et l'aliasse C. J'avais 20 valeurs, que je remultiplie par 5, j'ai donc 100 combinaisons. Si je fais : Code :
Je vous conseille très vivement de commencer par apprendre ce qu'est SQL. Pour cela le site de SQLPro contient tout ce qu'il faut @++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
||||||||||||||
|
00
|
|
|
#3 |
|
Invité de passage
![]() Inscription : février 2011 Messages : 32 ![]() |
Merci elsuket pour ton aide mais ma table est déjà créé donc la colonne A,B,C
sauf que j'ai ajouté la colonne combinaison pour affecter des valeurs . Les valeurs existent déjà dans la colonne A,B,C mais elles sont pas stocké par ordre. donc ca peut de la façon suivante A B C 1 1 null 2 1 null 1 nul null Et ainsi de suite. |
|
|
00
|
|
|
#4 |
|
Invité de passage
![]() Inscription : février 2011 Messages : 32 ![]() |
le but c'est d'avoir c'est d'avoir dans la table uneTableDeQuatreColonnes 4 colonnes
Valeurs stoké aléatoirement dans les colonnes A,B,C et Un compteur dans combinaison: A B C combinaison 1 null 4 1 1 1 null 2 4 nul 1 3 Etc |
|
|
00
|
|
|
#5 |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Un compteur ?
Quel serait le but de ce compteur et sur quel ordre se base-t-il ? |
|
|
00
|
|
|
#6 | ||
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 667 ![]() |
Vous pouvez tronquer votre table pour la remplir avec la requête que je vous ai donné.
Si vous avez besoin d'avoir un "ordre" aléatoire dans votre table, il suffit de changer en écrivant : Code :
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
||
|
00
|
|
|
#7 |
|
Invité de passage
![]() Inscription : février 2011 Messages : 32 ![]() |
merci elsuket encore pour ta réponse mais moi je ne peux pas remplir les colonnes A ,B et C.Il sont déjà rempli .dans le cadre de projet, je réalise la partie BI donc dans cette table site de montage, j'ai la colonne A qui est le siteMonteur ,déja rempli, colonne B site_approvisionnement déja rempli et table C fournisseur déja rempli.
Toutes ces colonnes je ne peux pas modifier.il faut que je créé une nouvelle colonne "combinaison "qui va affecter une combinaison a chaque tuple par exemple : combinaison1 pour siteMonteur 1 ,site_approvisionnement NULL et fournisseur 2 et ainsi de suite. Il faut avoir un id de combinaison pour chaque possibilité MERCI |
|
|
00
|
|
|
#8 | ||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Bonjour,
Si je comprend bien, vous voulez juste attribuer un identifiant à chaque ligne de votre table, sans ordre particulier ? vous pouvez faire ceci : Code SQL :
|
||
|
|
00
|
|
|
#9 |
|
Invité de passage
![]() Inscription : février 2011 Messages : 32 ![]() |
merci,
je voudrai attribuer des identifiant pour 100 lignes parce que je peux avoir 100 possibilités entre la colonne siteMonteur,site_approvisionnement et fournisseur . Donc pour chaque combinaison possible, il faut affecter1 identifiant. Merci |
|
|
00
|
|
|
#10 |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
![]() Vous voulez dire que dans votre table, vous pouvez avoir plusieurs fois la même combinaison et que dans ce cas, elles devront avoir le même identifiant ? |
|
|
00
|
|
|
#11 |
|
Invité de passage
![]() Inscription : février 2011 Messages : 32 ![]() |
oui,exactement
|
|
|
00
|
|
|
#12 | ||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
est-ce que ceci repond au besoin ?
Code SQL :
|
||
|
|
00
|
|
|
#13 |
|
Invité de passage
![]() Inscription : février 2011 Messages : 32 ![]() |
merci aieeeuuuu
C'est exactement ce que je voulais. super !!! Par contre est ce que vous pouvez m'expliquer ce que vous avez fait? surtout les 2 commandes COALESCE et DENSE_RANK() Je n'ai pas bien compris ce qu'ils font. Merci |
|
|
00
|
|
|
#14 | |||||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
bonjour,
DENSE_RANK ordonne les différentes combinaisons de A,B et C, et donne, pour chacune d'elle, son rang. Cela permet de générer l'identifiant pour chaque combinaison. vous pouvez exécuter directement la sous requete Code SQL :
Reste à mettre à jour la table avec ces données ! Pour cela, je fais un UPDATE en utilisant la pseudo table (requête ci-dessous), et je récupere l'ID (fournit par DENSE_RANK) en cherchant dans la pseudo table la ligne qui presente la même combinaison, soit basiquement Citation:
Table.B = pseudoTable.B n'est pas vérifiée car NULL n'est pas égal à NULL Il faut donc vérifier si Table.B = pseudoTable.B OU si les deux sont NULL COALESCE retourne la valeur du premier paramètre non null. Si (et seulement si) tous les parametres sont NULL(le cas qui nous interesse ici), cette fonction renvoi NULL On aurait aussi pu écrire (ce qui serait équivalent): Code SQL :
|
|||||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com