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 08/03/2011, 15h12   #1
Invité de passage
 
Inscription : avril 2008
Messages : 65
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 65
Points : 3
Points : 3
Par défaut Insertion en utilisant la condition CASE

Bonjour;
Je voudrais insérer des lignes dans une table en tenant compte des condition sur des champs de la table source.
j'ai fait une série de Case qui ne marche pas apparemment.
quelqu'un peut il m'aider svp

merci d'avance




Code sql :
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
 
 
INSERT [APtValues]
           ([MId]
           ,[ProId]
           ,[SitId]
           ,[GrValue]
           ,[CreationDate])
 
SELECT     
            [MId]
           ,A.[ProId]
           ,A.[SitId]
           ,(CASE WHEN A.Orientation = 'FC' THEN 
                                   case when A.IsG = 'RB' then 
                                   case A.IsG when '1' then SUM (A.AmtValue)
                                   end end  
                  ELSE  case when A.Dire = 'XA' then  SUM (A.AmtValue)end                
             END  ) AS GrValue
 
 
           ,GETDATE ()
 
FROM AP_Detail A 
 
 
     GROUP BY [MId]
              ,A.[ProId]
              ,A.[SitId]
              ,A.Orientation
              A.Dire
 
 
--==========
xavier81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2011, 15h25   #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
Pourquoi ne pas simplifier par ceci au lien d'enchainer les CASE ???
Code :
1
2
3
4
CASE 
WHEN A.Orientation = 'FC' AND A.IsG = 'RB' AND A.IsG = '1' then SUM (A.AmtValue)
when A.Dire = 'XA' then  SUM (A.AmtValue) end                
END  AS GrValue
On pourrait même simplifier ça en :


Code :
1
2
3
CASE WHEN ( A.Orientation = 'FC' AND A.IsG = 'RB' AND A.IsG = '1' )
			OR A.Dire = 'XA' 
				then SUM (A.AmtValue) END AS GrValue
__________________
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 10
Vieux 08/03/2011, 15h57   #3
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Le problème provient du GROUP BY, vous le faite sur les colonnes Orientation et Dire alors que dans le select vous avez des cases imbriqués.

Il faut que le select reflète le group by.
Pour ce faire, en appliquant la simplification de bon sens proposée ci-dessus :
Code :
1
2
3
4
5
6
7
8
9
10
11
INSERT INTO [APtValues] ([MId], [ProId], [SitId], [GrValue], [CreationDate])
  SELECT A.[MId], A.[ProId], A.[SitId],
         SUM(CASE
               WHEN (A.Orientation = 'FC' AND A.IsG = 'RB' AND A.IsG = '1')
                 OR A.Dire = 'XA' 
               THEN A.AmtValue
               ELSE 0
              END) AS GrValue,
         GETDATE ()
    FROM AP_Detail A 
GROUP BY A.[MId], A.[ProId], A.[SitId]
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 08/03/2011, 16h58   #4
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour

D'autre part, une coquille :

Code SQL :
1
2
3
 
when A.IsG = 'RB' then 
                                   case A.IsG when '1'

ou

Code SQL :
1
2
 
A.IsG = 'RB' AND A.IsG = '1'

Ces conditions ne seront jamais vraies toutes les deux !

Je ne sais pas ce que vous vouliez mettre, mais je pense que ce n'était pas ça
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2011, 14h36   #5
Invité de passage
 
Inscription : avril 2008
Messages : 65
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 65
Points : 3
Points : 3
merci ça marche bien votre proposition effectivement c'est le "group by" qui est la source du problème.

j'aimerais savoir comment faire si je veux faire un GROUP BY seulement sur MoId. car si je mets pas les autre champs dans la clause GROUP BY ça passe pas.

merci de me répondre svp
xavier81 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 09/03/2011, 15h23   #6
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Je ne suis pas sur d'avoir bien compris ce que vous vouliez(sinon, postez un jeu d'essai avec résultat attendu), mais en utilisant les fonctions de fenêtrage :

Code SQL :
1
2
3
4
5
6
7
8
9
10
11
 
INSERT INTO [APtValues] ([MId], [ProId], [SitId], [GrValue], [CreationDate])
  SELECT A.[MId], A.[ProId], A.[SitId],
         SUM(CASE
               WHEN (A.Orientation = 'FC' AND A.IsG = 'RB' AND A.IsG = '1')
                 OR A.Dire = 'XA' 
               THEN A.AmtValue
               ELSE 0
              END) OVER(PARTITION BY A.[Mid]) AS GrValue,
         GETDATE ()
    FROM AP_Detail A
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2011, 17h20   #7
Invité de passage
 
Inscription : avril 2008
Messages : 65
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 65
Points : 3
Points : 3
Bonjour;

dans le select il y a trois champs plus la SUM je veux faire une GROUP BY seulement sur une seul colonne pas les trois ensemble.

dans ce code il m'est impossible à chaque fois ça palante quand je fais :

'group by MoId ' seulement.

j'espère être claire.
merci
xavier81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2011, 17h26   #8
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Citation:
Envoyé par xavier81 Voir le message
Bonjour;

dans le select il y a trois champs plus la SUM je veux faire une GROUP BY seulement sur une seul colonne pas les trois ensemble.
Donc par exemple, pour un MoId, ProId et SitId donné, avoir la somme pour le MoId, tous ProId et SitId confondus ?

par exemple :
Citation:
MoID----ProId----SitId----Val
1---------A--------X--------1
1---------A--------Y--------2
1---------B--------X--------4
2---------A--------Z--------8
obtenir :
Citation:
1---------A--------X--------7
1---------A--------Y--------7
1---------B--------X--------7
2---------A--------Z--------8
avez vous testé la requête que je vous ai proposée ?
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2011, 17h37   #9
Invité de passage
 
Inscription : avril 2008
Messages : 65
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 65
Points : 3
Points : 3
oui je l'ai testé et j'ai la même erreur

Column 'RE-DW.dbo.MaTable.SitId' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

et pareil pour les autre colonne non spécifiées dans le Group By
xavier81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2011, 17h44   #10
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Heu...
je parlais de cette requete :
Code SQL :
1
2
3
4
5
6
7
8
9
10
11
     INSERT INTO [APtValues] ([MId], [ProId], [SitId], [GrValue], [CreationDate])
  SELECT A.[MId], A.[ProId], A.[SitId],
         SUM(CASE
               WHEN (A.Orientation = 'FC' AND A.IsG = 'RB' AND A.IsG = '1')
                 OR A.Dire = 'XA' 
               THEN A.AmtValue
               ELSE 0
              END) OVER(PARTITION BY A.[Mid]) AS GrValue,
         GETDATE ()
    FROM AP_Detail A


Et est-ce que l'exemple que j'ai mis correspond à ce que vous cherchez à obtenir ?

PS: essayez déjà sans la partie INSERT, pour voir si le SELECT est bien ce que vous voulez...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2011, 17h48   #11
Invité de passage
 
Inscription : avril 2008
Messages : 65
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 65
Points : 3
Points : 3
je l'ai essayé et ça me donne la même erreur que celle dans mon précédent message
xavier81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2011, 18h15   #12
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Avez vous bien enlevé le GROUP BY ????

Avez vous essayé juste la partie SELECT ??

aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2011, 09h17   #13
Invité de passage
 
Inscription : avril 2008
Messages : 65
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 65
Points : 3
Points : 3
oui j'ai enlevé le goup by et j'ai également essayé le select tout seul.

mais malheureusement l'erreur est la même:

Column 'dbo.MaTable.MoId' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
xavier81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2011, 09h45   #14
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 667
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 667
Points : 8 715
Points : 8 715
Bonjour,

Donnez le texte complet de la requête que vous exécutez.
La requête de aieeeuuuuu est correcte.

D'autre part les crochets ne servent à rien, comme l'alias A.

@++
__________________
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
elsuket 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 16h27.


 
 
 
 
Partenaires

Hébergement Web