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, 14h15   #1
Candidat au titre de Membre du Club
 
Inscription : octobre 2006
Messages : 468
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 468
Points : 11
Points : 11
Par défaut requete SQL SUM d'une Sum

bonjour à tous,


Je dipose d'une requete sql que j'ai "simplifié" j'ai enlevé les champs qui ne m'intessessait pas .

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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
 
 
 SELECT (SELECT coalesce (sum (ttotfichado.Tiempopasado),0)
     FROM  ttotfichado
     WHERE ttotfichado.hayabono<> 1 AND
           (NOT (ttOTFichado.RepartoPendiente = 0 AND ttOTFichado.FichajeContraOT > 0) OR ttOTFichado.RepartoPendiente IS NULL) AND
           ttOTIntervencion.Emp = ttOTFichado.Emp AND
           ttOTIntervencion.Numinterno = ttOTFichado.Numinterno AND  
           ttOTIntervencion.Intervencion = ttOTFichado.Intervencion AND
           ttotfichado.fecha <= '12-1-2011 23:59:59.000') AS tt,  
  Count(DISTINCT ttOTCab.NumOT),
  SUM(case tipocab
    when 0 then
      case tipolinea
        when 1 then
          case ttOTIntervencion.esabono
            when 1 then (-1 * ttotlinea.PrecioCosteMedio * coalesce (ttotcargolinea.cantidadhoras,ttotlinea.cantidadhoras))
            else             (ttotlinea.PrecioCosteMedio * coalesce (ttotcargolinea.cantidadhoras,ttotlinea.cantidadhoras))
          end
        else 0
      end	
    else 0
  end) AS ImpPCPMrec,
  tgtaller.descrip AS atelier,
  tgempresa.razon AS societe
 
FROM ttoTCab
 
  INNER JOIN tgempresa ON
  ttotcab.emp = tgempresa.emp 
 
  INNER JOIN tgtaller ON
  ttotcab.emp = tgtaller.emp AND ttotcab.taller = tgtaller.taller
 
  INNER JOIN ttOTIntervencion ON 
  ttOTCab.Emp = ttOTIntervencion.Emp AND 
  ttOTCab.NumInterno = ttOTIntervencion.Numinterno 
 
  INNER JOIN ttOTLinea ON 
  ttOTIntervencion.Emp = ttOTLinea.Emp AND 
  ttOTIntervencion.Numinterno = ttOTLinea.NumIntOT AND 
  ttOTIntervencion.Intervencion = ttOTLinea.NumIntIntervencion 
 
  INNER JOIN ttSeccion ON 
  ttOTCab.Seccion = ttSeccion.Seccion 
 
  INNER JOIN ttSeccion seccion ON 
  ttOTIntervencion.Seccion = seccion.Seccion 
 
  LEFT OUTER JOIN TTrecepcionista ON
  ttOtCab.emp = TTrecepcionista.emp AND
  ttOtCab.taller = TTrecepcionista.taller AND 
  ttOtCab.recepcionista = TTrecepcionista.recepcionista
 
  LEFT OUTER JOIN Tgmarca ON
  ttOtCab.marca = tgmarca.marca
 
  LEFT OUTER JOIN ttOTCargoLinea ON 
  ttOTLinea.Emp = ttOTCargoLinea.Emp AND
  ttOTLinea.NumIntOT = ttOTCargoLinea.NumIntOT AND 
  ttOTLinea.NumIntIntervencion = ttOTCargoLinea.NumIntIntervencion AND
  ttOTLinea.LineaItem = ttOTCargoLinea.LineaItem 
 
  LEFT OUTER JOIN ttOTCargoInt ON
  ttOTCargoLinea.Emp = ttotcargoint.emp AND
  ttOTCargoLinea.NumIntOT = ttotcargoint.Numintot AND 
  ttOTCargoLinea.NumIntIntervencion = ttotcargoint.numintintervencion AND
  ttOTCargoLinea.NumIntcargo = ttotcargoint.numintcargo 
 
  LEFT OUTER JOIN ttotcargo ON
  ttotcargoint.emp=ttotcargo.emp AND 
  ttotcargoint.NumIntOT=ttotcargo.NumInterno AND
  ttotcargoint.NumIntCargo=ttotcargo.Cargo 
 
  LEFT OUTER JOIN ttgrupocargo ON
  ttOTCargo.grupocargo = ttgrupocargo.grupo
 
  LEFT OUTER JOIN tgGrupoCont ON 
  ttOTLinea.GrupoCont = tgGrupoCont.GrupoCont
 
  LEFT OUTER JOIN tgMarca MarcaLinea ON 
  ttOTLinea.Marca = MarcaLinea.Marca
 
  LEFT OUTER JOIN tacategoriapieza ON	
  ttotlinea.marca = tacategoriapieza.marca AND ttotlinea.codigocategoria 	= tacategoriapieza.codigo
 
  LEFT OUTER JOIN ttotstatus 	  ON ttOTCab.statusencurso = ttotstatus.Codigo
 
WHERE   
   (ttotcab.emp='002' ) AND  
	(ttotintervencion.hayfactura = 0 ) AND
	(ttotcab.taller='20' ) AND  
	(ttOTCab.Anulada = 0) AND 
	(ttOTLinea.Anulada = 0) AND 
   (ttOTCab.FechaAperturaOT <= '12-1-2011 23:59:59.000' ) AND  
	(
	   ttOTLinea.FechaAlta <= '12-1-2011 23:59:59.000'
		OR ttotlinea.tipocab =1
	) AND 	
	(ttotlinea.tipocab <> 2) AND 
   (ttOTCab.STATUS = 30 )  AND
(ttotlinea.cantidadhoras <> 0 OR ttotlinea.almservido <> 1)
GROUP BY tgempresa.razon, tgtaller.descrip, ttOTIntervencion.Emp, ttOTIntervencion.Numinterno,  ttOTIntervencion.Intervencion
Ci-dessus ma requete.

J'arrive a récupérer le nom entreprise , atelier, plus le nombre de ligne (count).

Mais je n'arrive pas faire une somme d'une somme.

Ci-dessous la partie de la requête qui m'intéresser:
Code :
1
2
3
4
5
6
7
8
9
 
 (SELECT coalesce (sum (ttotfichado.Tiempopasado),0)
     FROM  ttotfichado
     WHERE ttotfichado.hayabono<> 1 AND
           (NOT (ttOTFichado.RepartoPendiente = 0 AND ttOTFichado.FichajeContraOT > 0) OR ttOTFichado.RepartoPendiente IS NULL) AND
           ttOTIntervencion.Emp = ttOTFichado.Emp AND
           ttOTIntervencion.Numinterno = ttOTFichado.Numinterno AND  
           ttOTIntervencion.Intervencion = ttOTFichado.Intervencion AND
           ttotfichado.fecha <= '12-1-2011 23:59:59.000') AS tt,
Ceci fait la somme dans une table. Et ce que je voudrait c'est la somme de cette somme. pour que cela sort comme ceci:

Code :
entreprise1|atelier|nbr 88| Somme total.
Alors que la actuellement cela sort comme ceci:
Code :
1
2
3
4
5
6
entreprise1|atelier1|nbr 1| som1
entreprise1|atelier1|nbr 1| som2
entreprise1|atelier1|nbr 1| som3
entreprise1|atelier1|nbr 1| som4
entreprise1|atelier1|nbr 1| som5
etc...
Comment réaliser ceci?

Merci d'avance pour votre aide

guigui69
guigui69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 19h07   #2
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Votre requète n'est pas aisée à decrypter mais vous groupez sur tgempresa.razon, tgtaller.descrip, ttOTIntervencion.Emp, ttOTIntervencion.Numinterno, ttOTIntervencion.Intervencion
et vous n'avez pas tout ces champs dans le select...

Testez en ne laissant que atelier et société dans votre group by?
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 08h17   #3
Candidat au titre de Membre du Club
 
Inscription : octobre 2006
Messages : 468
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 468
Points : 11
Points : 11
En enlevant "ttOTIntervencion.Emp, ttOTIntervencion.Numinterno, ttOTIntervencion.Intervencion" J'ai ceci comme message d'erreur:

Citation:
Serveur*: Msg 8120, Niveau 16, État 1, Ligne 1
La colonne 'ttOTIntervencion.Emp' n'est pas valide dans la liste de sélection parce qu'elle n'est pas contenue dans une fonction d'agrégation ou dans la clause GROUP BY.
Serveur*: Msg 8120, Niveau 16, État 1, Ligne 1
La colonne 'ttOTIntervencion.Numinterno' n'est pas valide dans la liste de sélection parce qu'elle n'est pas contenue dans une fonction d'agrégation ou dans la clause GROUP BY.
Serveur*: Msg 8120, Niveau 16, État 1, Ligne 1
La colonne 'ttOTIntervencion.Intervencion' n'est pas valide dans la liste de sélection parce qu'elle n'est pas contenue dans une fonction d'agrégation ou dans la clause GROUP BY.
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
 
SELECT (SELECT coalesce (sum (ttotfichado.Tiempopasado),0)
     FROM  ttotfichado
     WHERE ttotfichado.hayabono<> 1 AND
           (NOT (ttOTFichado.RepartoPendiente = 0 AND ttOTFichado.FichajeContraOT > 0) OR ttOTFichado.RepartoPendiente IS NULL) AND
           ttOTIntervencion.Emp = ttOTFichado.Emp AND
           ttOTIntervencion.Numinterno = ttOTFichado.Numinterno AND  
           ttOTIntervencion.Intervencion = ttOTFichado.Intervencion AND
           ttotfichado.fecha <= '12-1-2011 23:59:59.000') AS tt,  
  Count(DISTINCT ttOTCab.NumOT),
  SUM(case tipocab
    when 0 then
      case tipolinea
        when 1 then
          case ttOTIntervencion.esabono
            when 1 then (-1 * ttotlinea.PrecioCosteMedio * coalesce (ttotcargolinea.cantidadhoras,ttotlinea.cantidadhoras))
            else             (ttotlinea.PrecioCosteMedio * coalesce (ttotcargolinea.cantidadhoras,ttotlinea.cantidadhoras))
          end
        else 0
      end	
    else 0
  end) AS ImpPCPMrec,
  tgtaller.descrip AS atelier,
  tgempresa.razon AS societe
 
FROM ttoTCab
 
  INNER JOIN tgempresa ON
  ttotcab.emp = tgempresa.emp 
 
  INNER JOIN tgtaller ON
  ttotcab.emp = tgtaller.emp AND ttotcab.taller = tgtaller.taller
 
  INNER JOIN ttOTIntervencion ON 
  ttOTCab.Emp = ttOTIntervencion.Emp AND 
  ttOTCab.NumInterno = ttOTIntervencion.Numinterno 
 
  INNER JOIN ttOTLinea ON 
  ttOTIntervencion.Emp = ttOTLinea.Emp AND 
  ttOTIntervencion.Numinterno = ttOTLinea.NumIntOT AND 
  ttOTIntervencion.Intervencion = ttOTLinea.NumIntIntervencion 
 
  INNER JOIN ttSeccion ON 
  ttOTCab.Seccion = ttSeccion.Seccion 
 
  INNER JOIN ttSeccion seccion ON 
  ttOTIntervencion.Seccion = seccion.Seccion 
 
  LEFT OUTER JOIN TTrecepcionista ON
  ttOtCab.emp = TTrecepcionista.emp AND
  ttOtCab.taller = TTrecepcionista.taller AND 
  ttOtCab.recepcionista = TTrecepcionista.recepcionista
 
  LEFT OUTER JOIN Tgmarca ON
  ttOtCab.marca = tgmarca.marca
 
  LEFT OUTER JOIN ttOTCargoLinea ON 
  ttOTLinea.Emp = ttOTCargoLinea.Emp AND
  ttOTLinea.NumIntOT = ttOTCargoLinea.NumIntOT AND 
  ttOTLinea.NumIntIntervencion = ttOTCargoLinea.NumIntIntervencion AND
  ttOTLinea.LineaItem = ttOTCargoLinea.LineaItem 
 
  LEFT OUTER JOIN ttOTCargoInt ON
  ttOTCargoLinea.Emp = ttotcargoint.emp AND
  ttOTCargoLinea.NumIntOT = ttotcargoint.Numintot AND 
  ttOTCargoLinea.NumIntIntervencion = ttotcargoint.numintintervencion AND
  ttOTCargoLinea.NumIntcargo = ttotcargoint.numintcargo 
 
  LEFT OUTER JOIN ttotcargo ON
  ttotcargoint.emp=ttotcargo.emp AND 
  ttotcargoint.NumIntOT=ttotcargo.NumInterno AND
  ttotcargoint.NumIntCargo=ttotcargo.Cargo 
 
  LEFT OUTER JOIN ttgrupocargo ON
  ttOTCargo.grupocargo = ttgrupocargo.grupo
 
  LEFT OUTER JOIN tgGrupoCont ON 
  ttOTLinea.GrupoCont = tgGrupoCont.GrupoCont
 
  LEFT OUTER JOIN tgMarca MarcaLinea ON 
  ttOTLinea.Marca = MarcaLinea.Marca
 
  LEFT OUTER JOIN tacategoriapieza ON	
  ttotlinea.marca = tacategoriapieza.marca AND ttotlinea.codigocategoria 	= tacategoriapieza.codigo
 
  LEFT OUTER JOIN ttotstatus 	  ON ttOTCab.statusencurso = ttotstatus.Codigo
 
WHERE   
   (ttotcab.emp='002' ) AND  
	(ttotintervencion.hayfactura = 0 ) AND
	(ttotcab.taller='20' ) AND  
	(ttOTCab.Anulada = 0) AND 
	(ttOTLinea.Anulada = 0) AND 
   (ttOTCab.FechaAperturaOT <= '12-1-2011 23:59:59.000' ) AND  
	(
	   ttOTLinea.FechaAlta <= '12-1-2011 23:59:59.000'
		OR ttotlinea.tipocab =1
	) AND 	
	(ttotlinea.tipocab <> 2) AND 
   (ttOTCab.STATUS = 30 )  AND
(ttotlinea.cantidadhoras <> 0 OR ttotlinea.almservido <> 1)
GROUP BY tgempresa.razon, tgtaller.descrip
guigui69
guigui69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 08h39   #4
Candidat au titre de Membre du Club
 
Inscription : octobre 2006
Messages : 468
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 468
Points : 11
Points : 11
Voila ce que me retourne ka requete normalement:

Code :
1
2
3
4
5
6
7
8
9
 
(SELECT coalesce (sum (ttotfichado.Tiempopasado),0)
     FROM  ttotfichado
     WHERE ttotfichado.hayabono<> 1 AND
           (NOT (ttOTFichado.RepartoPendiente = 0 AND ttOTFichado.FichajeContraOT > 0) OR ttOTFichado.RepartoPendiente IS NULL) AND
           ttOTIntervencion.Emp = ttOTFichado.Emp AND
           ttOTIntervencion.Numinterno = ttOTFichado.Numinterno AND  
           ttOTIntervencion.Intervencion = ttOTFichado.Intervencion AND
           ttotfichado.fecha <= '12-1-2011 23:59:59.000') AS tt,
Voila le resultat:
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
66
67
68
69
70
71
72
73
 
8.2100
38.7400
.3500
.3200
4.4100
.5000
.0000
2.1300
1.5300
8.2100
38.7400
.8300
.0000
4.4100
8.2100
38.7400
2.1300
3.3500
8.2100
38.7400
5.1100
.0000
4.4100
8.2100
38.7400
2.1300
3.3500
4.4100
38.7400
5.1100
.2800
.0000
4.9400
8.2100
38.7400
3.3500
2.1400
4.4100
38.7400
5.1100
.9800
.0000
4.9400
8.2100
38.7400
3.2600
.0000
4.4100
38.7400
5.1100
.9800
.0000
4.9400
8.2100
3.2600
38.7400
2.8800
4.4100
38.7400
5.1100
.9800
.0000
4.9400
8.2100
.0000
38.7400
.3200
4.4100
38.7400
.0000
2.1300
.0000
Et ce que je voudrait c'est la somme de tout ca.

Désolé si je ne suis pas clair dans mon explication.

Guigui69
guigui69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 10h13   #5
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
Pas très clair en effet...

Veux-tu cette somme pour chaque ligne de résultat ? dans ce cas enlève la corrélation entre la sous requête et la requête principale. En plus ta requête n'en sera que plus rapide !

Si tu veux garder les sous-totaux, mais calculer à la fin le total global, tu peux mettre quelque chose comme :

Code SQL :
1
2
 
COMPUTE SUM(tt)

à la fin de ta requête...

Un petit jeu de données, et surtout le résultat attendu nous aiderait a comprendre...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 16h30   #6
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
Surtout que COMPUTE est désaprouvé et sera retirée...
Utilisez éventuellement CUBE ou ROLLUP, sinon une sous requête en table dérivée, ou mieux, une CTE.

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 17/03/2011, 21h17   #7
Candidat au titre de Membre du Club
 
Inscription : octobre 2006
Messages : 468
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 468
Points : 11
Points : 11
Bonsoir,

Je voudrait en faite la somme de ca

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
66
67
68
69
70
71
72
73
 
8.2100
38.7400
.3500
.3200
4.4100
.5000
.0000
2.1300
1.5300
8.2100
38.7400
.8300
.0000
4.4100
8.2100
38.7400
2.1300
3.3500
8.2100
38.7400
5.1100
.0000
4.4100
8.2100
38.7400
2.1300
3.3500
4.4100
38.7400
5.1100
.2800
.0000
4.9400
8.2100
38.7400
3.3500
2.1400
4.4100
38.7400
5.1100
.9800
.0000
4.9400
8.2100
38.7400
3.2600
.0000
4.4100
38.7400
5.1100
.9800
.0000
4.9400
8.2100
3.2600
38.7400
2.8800
4.4100
38.7400
5.1100
.9800
.0000
4.9400
8.2100
.0000
38.7400
.3200
4.4100
38.7400
.0000
2.1300
.0000
Je voudrait arriver sur 734.02 qui est la somme de toute ces lignes.

Et quand résultat final (le résultat de la requête)j'ai:

Entreprise toto | Atelier1 | 78|734.02|
guigui69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2011, 08h30   #8
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,

Citation:
Je dipose d'une requete sql que j'ai "simplifié" j'ai enlevé les champs qui ne m'intessessait pas.
Vous auriez du au passage polisher la structure de votre requête en termes de lisibilité.
Ensuite vous ne qualifiez pas les noms des tables par le nom du schéma auquel elles appartiennent, ce qui oblige SQL Server au moment de l'exécution à le chercher à votre place.
Dommage que vous n'ayez pas aliasé le nom de vos tables, surtout puisqu'elles sont nombreuses, car cela allège le texte de la requête.
Les parenthèses après le WHERE servent rarement à quelque chose sauf à alourdir le texte de la requête.
Enfin la jointure LEFT JOIN tgMarca MarcaLinea peut être combinée avec celle plus haut sur la même table.
Je ne suis pas sûr des alias dans le CASE du SUM (L.tipocab et L.tipolinea)

Tout cela fait, on obtient :

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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
SELECT		tt.somme
		, COUNT(DISTINCT TCab.NumOT)
		, SUM
		(
			CASE L.tipocab
				WHEN 0 THEN CASE L.tipolinea
							WHEN 1 THEN CASE I.esabono
									WHEN 1 THEN (-1 * L.PrecioCosteMedio * COALESCE(CL.cantidadhoras, L.cantidadhoras))
									ELSE L.PrecioCosteMedio * COALESCE(CL.cantidadhoras, L.cantidadhoras)
								END
							ELSE 0
					END	
				ELSE 0
			END
		) AS ImpPCPMrec,
		, T.descrip AS atelier
		, E.razon AS societe  
FROM		dbo.ttotcab AS TCab
INNER JOIN	dbo.tgempresa AS E
			ON TCab.emp = E.emp 
INNER JOIN	dbo.tgtaller AS T
			ON TCab.emp = T.emp 
			AND TCab.taller = T.taller
INNER JOIN	dbo.ttOTIntervencion AS I
			ON TCab.Emp = I.Emp
			AND TCab.NumInterno = I.Numinterno 
INNER JOIN	dbo.ttOTLinea AS L
			ON I.Emp = L.Emp 
			AND I.Numinterno = L.NumIntOT 
			AND I.Intervencion = L.NumIntIntervencion 
INNER JOIN	dbo.ttSeccion AS S1
			ON TCab.Seccion = S1.Seccion 
INNER JOIN	dbo.ttSeccion AS S2
			ON I.Seccion = S2.Seccion 
LEFT JOIN	dbo.TTrecepcionista AS R
			ON TCab.emp = R.emp 
			AND TCab.taller = R.taller 
			AND TCab.recepcionista = R.recepcionista
LEFT JOIN	dbo.Tgmarca AS M
			ON TCab.marca = M.marca
			AND L.Marca = M.Marca
LEFT JOIN	dbo.ttOTCargoLinea AS CL
			ON L.Emp = CL.Emp
			AND L.NumIntOT = CL.NumIntOT 
			AND L.NumIntIntervencion = CL.NumIntIntervencion 
			AND L.LineaItem = CL.LineaItem 
LEFT JOIN	dbo.ttOTCargoInt AS CI
			ON CL.Emp = CI.emp
			AND CL.NumIntOT = CI.Numintot
			AND CL.NumIntIntervencion = CI.numintintervencion 
			AND CL.NumIntcargo = CI.numintcargo 
LEFT JOIN	dbo.ttotcargo AS C
			ON CI.emp = C.emp
			AND CI.NumIntOT = C.NumInterno 
			AND CI.NumIntCargo = C.Cargo 
LEFT JOIN	dbo.ttgrupocargo GC 
			ON C.grupocargo = GC.grupo
LEFT JOIN	dbo.tgGrupoCont AS GCT
			ON L.GrupoCont = GCT.GrupoCont
LEFT JOIN	dbo.tacategoriapieza CP
			ON L.marca = CP.marca
			AND L.codigocategoria = CP.codigo
LEFT JOIN	dbo.ttotstatus AS S
			ON TCab.statusencurso = S.Codigo
CROSS APPLY	(
			SELECT		COALESCE (SUM(F.Tiempopasado), 0)
			FROM		dbo.ttotfichado AS F
			INNER JOIN	dbo.ttOTIntervencion AS I 
						ON I.Emp = F.Emp
						AND I.Intervencion = F.Intervencion
			WHERE		F.hayabono <> 1
			AND		(
						NOT (
							F.RepartoPendiente = 0
							AND F.FichajeContraOT > 0
						)
						OR F.RepartoPendiente IS NULL
					)
			AND		I.Numinterno = F.Numinterno
			AND		F.fecha <= '12-1-2011 23:59:59.000'
		) AS tt (somme)
WHERE		TCab.emp = '002'
AND		I.hayfactura = 0
AND		TCab.taller = '20'
AND		TCab.Anulada = 0
AND		L.Anulada = 0
AND		TCab.FechaAperturaOT <= '12-1-2011 23:59:59.000'
AND		(
			L.FechaAlta <= '12-1-2011 23:59:59.000'
			OR L.tipocab = 1
		)
AND 		L.tipocab <> 2
AND		TCab.STATUS = 30 
AND		(
			L.cantidadhoras <> 0
			OR L.almservido <> 1
		)
GROUP BY	G.razon, T.descrip
J'ai changé le SUM de la sous-requête en CROSS APPLY, histoire d'y voir également plus clair.
Bref, y'a eu débroussaillage

Comme suggéré par SQLPro, j'ai donc passé cette requête dans une CTE (vous savez comme je suis un fan des CTE) ce qui donne :

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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
;WITH
	CTE AS
	(
		SELECT		tt.somme
				, COUNT(DISTINCT TCab.NumOT)
				, SUM
				(
					CASE L.tipocab
						WHEN 0 THEN CASE L.tipolinea
									WHEN 1 THEN CASE I.esabono
											WHEN 1 THEN (-1 * L.PrecioCosteMedio * COALESCE(CL.cantidadhoras, L.cantidadhoras))
											ELSE L.PrecioCosteMedio * COALESCE(CL.cantidadhoras, L.cantidadhoras)
										END
									ELSE 0
							END	
						ELSE 0
					END
				) AS ImpPCPMrec,
				, T.descrip AS atelier
				, E.razon AS societe  
		FROM		dbo.ttotcab AS TCab
		INNER JOIN	dbo.tgempresa AS E
					ON TCab.emp = E.emp 
		INNER JOIN	dbo.tgtaller AS T
					ON TCab.emp = T.emp 
					AND TCab.taller = T.taller
		INNER JOIN	dbo.ttOTIntervencion AS I
					ON TCab.Emp = I.Emp
					AND TCab.NumInterno = I.Numinterno 
		INNER JOIN	dbo.ttOTLinea AS L
					ON I.Emp = L.Emp 
					AND I.Numinterno = L.NumIntOT 
					AND I.Intervencion = L.NumIntIntervencion 
		INNER JOIN	dbo.ttSeccion AS S1
					ON TCab.Seccion = S1.Seccion 
		INNER JOIN	dbo.ttSeccion AS S2
					ON I.Seccion = S2.Seccion 
		LEFT JOIN	dbo.TTrecepcionista AS R
					ON TCab.emp = R.emp 
					AND TCab.taller = R.taller 
					AND TCab.recepcionista = R.recepcionista
		LEFT JOIN	dbo.Tgmarca AS M
					ON TCab.marca = M.marca
					AND L.Marca = M.Marca
		LEFT JOIN	dbo.ttOTCargoLinea AS CL
					ON L.Emp = CL.Emp
					AND L.NumIntOT = CL.NumIntOT 
					AND L.NumIntIntervencion = CL.NumIntIntervencion 
					AND L.LineaItem = CL.LineaItem 
		LEFT JOIN	dbo.ttOTCargoInt AS CI
					ON CL.Emp = CI.emp
					AND CL.NumIntOT = CI.Numintot
					AND CL.NumIntIntervencion = CI.numintintervencion 
					AND CL.NumIntcargo = CI.numintcargo 
		LEFT JOIN	dbo.ttotcargo AS C
					ON CI.emp = C.emp
					AND CI.NumIntOT = C.NumInterno 
					AND CI.NumIntCargo = C.Cargo 
		LEFT JOIN	dbo.ttgrupocargo GC 
					ON C.grupocargo = GC.grupo
		LEFT JOIN	dbo.tgGrupoCont AS GCT
					ON L.GrupoCont = GCT.GrupoCont
		LEFT JOIN	dbo.tacategoriapieza CP
					ON L.marca = CP.marca
					AND L.codigocategoria = CP.codigo
		LEFT JOIN	dbo.ttotstatus AS S
					ON TCab.statusencurso = S.Codigo
		CROSS APPLY	(
					SELECT		COALESCE (SUM(F.Tiempopasado), 0)
					FROM		dbo.ttotfichado AS F
					INNER JOIN	dbo.ttOTIntervencion AS I 
								ON I.Emp = F.Emp
								AND I.Intervencion = F.Intervencion
					WHERE		F.hayabono <> 1
					AND		(
								NOT (
									F.RepartoPendiente = 0
									AND F.FichajeContraOT > 0
								)
								OR F.RepartoPendiente IS NULL
							)
					AND		I.Numinterno = F.Numinterno
					AND		F.fecha <= '12-1-2011 23:59:59.000'
				) AS tt (somme)
		WHERE		TCab.emp = '002'
		AND		I.hayfactura = 0
		AND		TCab.taller = '20'
		AND		TCab.Anulada = 0
		AND		L.Anulada = 0
		AND		TCab.FechaAperturaOT <= '12-1-2011 23:59:59.000'
		AND		(
					L.FechaAlta <= '12-1-2011 23:59:59.000'
					OR L.tipocab = 1
				)
		AND 		L.tipocab <> 2
		AND		TCab.STATUS = 30 
		AND		(
					L.cantidadhoras <> 0
					OR L.almservido <> 1
				)
		GROUP BY	G.razon, T.descrip
	)
SELECT	societe
	, atelier
	, SUM(somme) AS final_somme
FROM	CTE
GROUP	BY societe, atelier
Mais vous pouvez aussi écrire :

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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
SELECT	societe
	, atelier
	, SUM(somme) AS final_somme
FROM	(
		SELECT		tt.somme
				, COUNT(DISTINCT TCab.NumOT)
				, SUM
				(
					CASE L.tipocab
						WHEN 0 THEN CASE L.tipolinea
									WHEN 1 THEN CASE I.esabono
											WHEN 1 THEN (-1 * L.PrecioCosteMedio * COALESCE(CL.cantidadhoras, L.cantidadhoras))
											ELSE L.PrecioCosteMedio * COALESCE(CL.cantidadhoras, L.cantidadhoras)
										END
									ELSE 0
							END	
						ELSE 0
					END
				) AS ImpPCPMrec,
				, T.descrip AS atelier
				, E.razon AS societe  
		FROM		dbo.ttotcab AS TCab
		INNER JOIN	dbo.tgempresa AS E
					ON TCab.emp = E.emp 
		INNER JOIN	dbo.tgtaller AS T
					ON TCab.emp = T.emp 
					AND TCab.taller = T.taller
		INNER JOIN	dbo.ttOTIntervencion AS I
					ON TCab.Emp = I.Emp
					AND TCab.NumInterno = I.Numinterno 
		INNER JOIN	dbo.ttOTLinea AS L
					ON I.Emp = L.Emp 
					AND I.Numinterno = L.NumIntOT 
					AND I.Intervencion = L.NumIntIntervencion 
		INNER JOIN	dbo.ttSeccion AS S1
					ON TCab.Seccion = S1.Seccion 
		INNER JOIN	dbo.ttSeccion AS S2
					ON I.Seccion = S2.Seccion 
		LEFT JOIN	dbo.TTrecepcionista AS R
					ON TCab.emp = R.emp 
					AND TCab.taller = R.taller 
					AND TCab.recepcionista = R.recepcionista
		LEFT JOIN	dbo.Tgmarca AS M
					ON TCab.marca = M.marca
					AND L.Marca = M.Marca
		LEFT JOIN	dbo.ttOTCargoLinea AS CL
					ON L.Emp = CL.Emp
					AND L.NumIntOT = CL.NumIntOT 
					AND L.NumIntIntervencion = CL.NumIntIntervencion 
					AND L.LineaItem = CL.LineaItem 
		LEFT JOIN	dbo.ttOTCargoInt AS CI
					ON CL.Emp = CI.emp
					AND CL.NumIntOT = CI.Numintot
					AND CL.NumIntIntervencion = CI.numintintervencion 
					AND CL.NumIntcargo = CI.numintcargo 
		LEFT JOIN	dbo.ttotcargo AS C
					ON CI.emp = C.emp
					AND CI.NumIntOT = C.NumInterno 
					AND CI.NumIntCargo = C.Cargo 
		LEFT JOIN	dbo.ttgrupocargo GC 
					ON C.grupocargo = GC.grupo
		LEFT JOIN	dbo.tgGrupoCont AS GCT
					ON L.GrupoCont = GCT.GrupoCont
		LEFT JOIN	dbo.tacategoriapieza CP
					ON L.marca = CP.marca
					AND L.codigocategoria = CP.codigo
		LEFT JOIN	dbo.ttotstatus AS S
					ON TCab.statusencurso = S.Codigo
		CROSS APPLY	(
					SELECT		COALESCE (SUM(F.Tiempopasado), 0)
					FROM		dbo.ttotfichado AS F
					INNER JOIN	dbo.ttOTIntervencion AS I 
								ON I.Emp = F.Emp
								AND I.Intervencion = F.Intervencion
					WHERE		F.hayabono <> 1
					AND		(
								NOT (
									F.RepartoPendiente = 0
									AND F.FichajeContraOT > 0
								)
								OR F.RepartoPendiente IS NULL
							)
					AND		I.Numinterno = F.Numinterno
					AND		F.fecha <= '12-1-2011 23:59:59.000'
				) AS tt (somme)
		WHERE		TCab.emp = '002'
		AND		I.hayfactura = 0
		AND		TCab.taller = '20'
		AND		TCab.Anulada = 0
		AND		L.Anulada = 0
		AND		TCab.FechaAperturaOT <= '12-1-2011 23:59:59.000'
		AND		(
					L.FechaAlta <= '12-1-2011 23:59:59.000'
					OR L.tipocab = 1
				)
		AND 		L.tipocab <> 2
		AND		TCab.STATUS = 30 
		AND		(
					L.cantidadhoras <> 0
					OR L.almservido <> 1
				)
		GROUP BY	G.razon, T.descrip
	)
GROUP	BY societe, atelier
C'est à dire la table dérivée.

Vous noterez au passage que les filtres comme <> ne sont pas SARGables

Maintenant, est-il bien nécessaire de faire tous ces calculs pour obtenir un "super"-agrégat ? N'auriez-vous pas du faire une vue de cette requête ?

@++
__________________
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
Vieux 18/03/2011, 08h35   #9
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Bravo elsuket, je n'ai pas eu le courage
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2011, 08h38   #10
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
J'ai un jeu d'expressions régulières qui font le boulot pour moi
Les développeurs des entreprises dans lesquelles je suis passé sont parfois aussi un peu brouillon, donc un jour j'en ai eu marre.
Elles ne font pas tout ce qu'on pourrait faire, mais elles me font gagner pas mal de temps

@++
__________________
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
Vieux 18/03/2011, 15h38   #11
Candidat au titre de Membre du Club
 
Inscription : octobre 2006
Messages : 468
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 468
Points : 11
Points : 11
Merci pour vos réponses.

La requête ce n'ai pas moi qu'il la réalisé, cela provient directement de notre Système d'information. C'est cette requête qui nous sort nos chiffres.

Je regarde et je reply.


Citation:
Ensuite vous ne qualifiez pas les noms des tables par le nom du schéma auquel elles appartiennent, ce qui oblige SQL Server au moment de l'exécution à le chercher à votre place.
Dommage que vous n'ayez pas aliasé le nom de vos tables, surtout puisqu'elles sont nombreuses, car cela allège le texte de la requête.
Les parenthèses après le WHERE servent rarement à quelque chose sauf à alourdir le texte de la requête.
Enfin la jointure LEFT JOIN tgMarca MarcaLinea peut être combinée avec celle plus haut sur la même table.
Je ne suis pas sûr des alias dans le CASE du SUM (L.tipocab et L.tipolinea)
Ca je ne comprend pas ==> Ensuite vous ne qualifiez pas les noms des tables par le nom du schéma auquel elles appartiennent, ce qui oblige SQL Server au moment de l'exécution à le chercher à votre place.

guigui69
guigui69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2011, 16h06   #12
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
Citation:
La requête ce n'ai pas moi qu'il la réalisé, cela provient directement de notre Système d'information. C'est cette requête qui nous sort nos chiffres.
Vous voulez dire que c'est le SI qui l'a générée ?
Vous savez, les automatismes en programmation, c'est jamais super-nickel.
Ça aide c'est sûr, mais faut repasser derrière histoire de bien polisher

Citation:
Ca je ne comprend pas ==> Ensuite vous ne qualifiez pas les noms des tables par le nom du schéma auquel elles appartiennent, ce qui oblige SQL Server au moment de l'exécution à le chercher à votre place.
En fait vous avez dans toute base de données SQL Server (au moins depuis la version 2000) deux schémas par défaut : dbo (pour les utilisateurs) et sys (qui expose une grande partie des tables et vues système).
Quand vous créez une table, elle est par défaut créée sous le schéma dbo.
Si vous ne le précisez pas dans vos requêtes (ou votre SI !), alors SQL Server cherche celui-ci et le compare à l'entité qui exécute la requête pour connaître ses privilèges de navigation dans la base de données.
Si vous ne le précisez pas SQL Server le cherche donc dans les tables de métadonnées.
C'est du pouillème bien sûr, mais des pouillèmes additionnés ...

@++
__________________
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
Vieux 20/03/2011, 19h23   #13
Candidat au titre de Membre du Club
 
Inscription : octobre 2006
Messages : 468
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 468
Points : 11
Points : 11
Merci pour l'explication, je vais relire ca pour bien tout comprendre.
(Comment préciser ceci dans ma requête)
Concernant vos requêtes, il m'indique une erreur au niveau du "CROSS APPLY" lorsque j'essaie de l'exécuter:

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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
 
SELECT		tt.somme
		, COUNT(DISTINCT TCab.NumOT)
		, SUM
		(
			CASE L.tipocab
				WHEN 0 THEN CASE L.tipolinea
							WHEN 1 THEN CASE I.esabono
									WHEN 1 THEN (-1 * L.PrecioCosteMedio * COALESCE(CL.cantidadhoras, L.cantidadhoras))
									ELSE L.PrecioCosteMedio * COALESCE(CL.cantidadhoras, L.cantidadhoras)
								END
							ELSE 0
					END	
				ELSE 0
			END
		) AS ImpPCPMrec,
		, T.descrip AS atelier
		, E.razon AS societe  
FROM		dbo.ttotcab AS TCab
INNER JOIN	dbo.tgempresa AS E
			ON TCab.emp = E.emp 
INNER JOIN	dbo.tgtaller AS T
			ON TCab.emp = T.emp 
			AND TCab.taller = T.taller
INNER JOIN	dbo.ttOTIntervencion AS I
			ON TCab.Emp = I.Emp
			AND TCab.NumInterno = I.Numinterno 
INNER JOIN	dbo.ttOTLinea AS L
			ON I.Emp = L.Emp 
			AND I.Numinterno = L.NumIntOT 
			AND I.Intervencion = L.NumIntIntervencion 
INNER JOIN	dbo.ttSeccion AS S1
			ON TCab.Seccion = S1.Seccion 
INNER JOIN	dbo.ttSeccion AS S2
			ON I.Seccion = S2.Seccion 
LEFT JOIN	dbo.TTrecepcionista AS R
			ON TCab.emp = R.emp 
			AND TCab.taller = R.taller 
			AND TCab.recepcionista = R.recepcionista
LEFT JOIN	dbo.Tgmarca AS M
			ON TCab.marca = M.marca
			AND L.Marca = M.Marca
LEFT JOIN	dbo.ttOTCargoLinea AS CL
			ON L.Emp = CL.Emp
			AND L.NumIntOT = CL.NumIntOT 
			AND L.NumIntIntervencion = CL.NumIntIntervencion 
			AND L.LineaItem = CL.LineaItem 
LEFT JOIN	dbo.ttOTCargoInt AS CI
			ON CL.Emp = CI.emp
			AND CL.NumIntOT = CI.Numintot
			AND CL.NumIntIntervencion = CI.numintintervencion 
			AND CL.NumIntcargo = CI.numintcargo 
LEFT JOIN	dbo.ttotcargo AS C
			ON CI.emp = C.emp
			AND CI.NumIntOT = C.NumInterno 
			AND CI.NumIntCargo = C.Cargo 
LEFT JOIN	dbo.ttgrupocargo GC 
			ON C.grupocargo = GC.grupo
LEFT JOIN	dbo.tgGrupoCont AS GCT
			ON L.GrupoCont = GCT.GrupoCont
LEFT JOIN	dbo.tacategoriapieza CP
			ON L.marca = CP.marca
			AND L.codigocategoria = CP.codigo
LEFT JOIN	dbo.ttotstatus AS S
			ON TCab.statusencurso = S.Codigo
CROSS APPLY	(
			SELECT		COALESCE (SUM(F.Tiempopasado), 0)
			FROM		dbo.ttotfichado AS F
			INNER JOIN	dbo.ttOTIntervencion AS I 
						ON I.Emp = F.Emp
						AND I.Intervencion = F.Intervencion
			WHERE		F.hayabono <> 1
			AND		(
						NOT (
							F.RepartoPendiente = 0
							AND F.FichajeContraOT > 0
						)
						OR F.RepartoPendiente IS NULL
					)
			AND		I.Numinterno = F.Numinterno
			AND		F.fecha <= '12-1-2011 23:59:59.000'
		) AS tt (somme)
WHERE		TCab.emp = '002'
AND		I.hayfactura = 0
AND		TCab.taller = '20'
AND		TCab.Anulada = 0
AND		L.Anulada = 0
AND		TCab.FechaAperturaOT <= '12-1-2011 23:59:59.000'
AND		(
			L.FechaAlta <= '12-1-2011 23:59:59.000'
			OR L.tipocab = 1
		)
AND 		L.tipocab <> 2
AND		TCab.STATUS = 30 
AND		(
			L.cantidadhoras <> 0
			OR L.almservido <> 1
		)
GROUP BY	G.razon, T.descrip

Merci

guigui69
guigui69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2011, 08h56   #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
Pouvez-vous nous donner le libellé de l'erreur ainsi que la version de SQL Server que vous utilisez (vous pouvez utiliser une des deux requêtes que j'ai publié ici) ?

@++
__________________
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
Vieux 21/03/2011, 09h46   #15
Candidat au titre de Membre du Club
 
Inscription : octobre 2006
Messages : 468
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 468
Points : 11
Points : 11
Code :
1
2
3
4
5
 
Serveur*: Msg 170, Niveau 15, État 1, Ligne 63
Ligne 63 : syntaxe incorrecte vers 'APPLY'.
Serveur*: Msg 156, Niveau 15, État 1, Ligne 79
Syntaxe incorrecte vers le mot clé 'AS'.
Code :
1
2
3
4
 
Edition	Developer Edition
ProductLevel	SP4
ProductVersion	8.00.2039
guigui69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2011, 09h59   #16
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

En effet, il me semble que l'opérateur "CROSS APPLY" n'est supporté que depuis la version 2005 (9), vous êtes en version 2000...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2011, 14h19   #17
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
Ni les CTE, donc on doit revenir à :

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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
SELECT	societe
	, atelier
	, SUM(somme) AS final_somme
FROM	(
		SELECT		(
					SELECT		COALESCE (SUM(F.Tiempopasado), 0)
					FROM		dbo.ttotfichado AS F
					INNER JOIN	dbo.ttOTIntervencion AS I 
								ON I.Emp = F.Emp
								AND I.Intervencion = F.Intervencion
					WHERE		F.hayabono <> 1
					AND		(
								NOT (
									F.RepartoPendiente = 0
									AND F.FichajeContraOT > 0
								)
								OR F.RepartoPendiente IS NULL
							)
					AND		I.Numinterno = F.Numinterno
					AND		F.fecha <= '12-1-2011 23:59:59.000'
				) AS somme
				, COUNT(DISTINCT TCab.NumOT)
				, SUM
				(
					CASE L.tipocab
						WHEN 0 THEN CASE L.tipolinea
									WHEN 1 THEN CASE I.esabono
											WHEN 1 THEN (-1 * L.PrecioCosteMedio * COALESCE(CL.cantidadhoras, L.cantidadhoras))
											ELSE L.PrecioCosteMedio * COALESCE(CL.cantidadhoras, L.cantidadhoras)
										END
									ELSE 0
							END	
						ELSE 0
					END
				) AS ImpPCPMrec,
				, T.descrip AS atelier
				, E.razon AS societe  
		FROM		dbo.ttotcab AS TCab
		INNER JOIN	dbo.tgempresa AS E
					ON TCab.emp = E.emp 
		INNER JOIN	dbo.tgtaller AS T
					ON TCab.emp = T.emp 
					AND TCab.taller = T.taller
		INNER JOIN	dbo.ttOTIntervencion AS I
					ON TCab.Emp = I.Emp
					AND TCab.NumInterno = I.Numinterno 
		INNER JOIN	dbo.ttOTLinea AS L
					ON I.Emp = L.Emp 
					AND I.Numinterno = L.NumIntOT 
					AND I.Intervencion = L.NumIntIntervencion 
		INNER JOIN	dbo.ttSeccion AS S1
					ON TCab.Seccion = S1.Seccion 
		INNER JOIN	dbo.ttSeccion AS S2
					ON I.Seccion = S2.Seccion 
		LEFT JOIN	dbo.TTrecepcionista AS R
					ON TCab.emp = R.emp 
					AND TCab.taller = R.taller 
					AND TCab.recepcionista = R.recepcionista
		LEFT JOIN	dbo.Tgmarca AS M
					ON TCab.marca = M.marca
					AND L.Marca = M.Marca
		LEFT JOIN	dbo.ttOTCargoLinea AS CL
					ON L.Emp = CL.Emp
					AND L.NumIntOT = CL.NumIntOT 
					AND L.NumIntIntervencion = CL.NumIntIntervencion 
					AND L.LineaItem = CL.LineaItem 
		LEFT JOIN	dbo.ttOTCargoInt AS CI
					ON CL.Emp = CI.emp
					AND CL.NumIntOT = CI.Numintot
					AND CL.NumIntIntervencion = CI.numintintervencion 
					AND CL.NumIntcargo = CI.numintcargo 
		LEFT JOIN	dbo.ttotcargo AS C
					ON CI.emp = C.emp
					AND CI.NumIntOT = C.NumInterno 
					AND CI.NumIntCargo = C.Cargo 
		LEFT JOIN	dbo.ttgrupocargo GC 
					ON C.grupocargo = GC.grupo
		LEFT JOIN	dbo.tgGrupoCont AS GCT
					ON L.GrupoCont = GCT.GrupoCont
		LEFT JOIN	dbo.tacategoriapieza CP
					ON L.marca = CP.marca
					AND L.codigocategoria = CP.codigo
		LEFT JOIN	dbo.ttotstatus AS S
					ON TCab.statusencurso = S.Codigo
		WHERE		TCab.emp = '002'
		AND		I.hayfactura = 0
		AND		TCab.taller = '20'
		AND		TCab.Anulada = 0
		AND		L.Anulada = 0
		AND		TCab.FechaAperturaOT <= '12-1-2011 23:59:59.000'
		AND		(
					L.FechaAlta <= '12-1-2011 23:59:59.000'
					OR L.tipocab = 1
				)
		AND 		L.tipocab <> 2
		AND		TCab.STATUS = 30 
		AND		(
					L.cantidadhoras <> 0
					OR L.almservido <> 1
				)
		GROUP BY	G.razon, T.descrip
	)
GROUP	BY societe, atelier
Cherchez un peu !
En outre, si vous aviez respecté la charte de postage de ce forum, en particulier :

Citation:
Créer un nouveau post

Le sujet

Commencez en spécifiant la version utilisée
Vous n'auriez pas perdu votre temps, et nous non plus par la même occasion !

@++
__________________
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 10
Vieux 21/03/2011, 18h11   #18
Candidat au titre de Membre du Club
 
Inscription : octobre 2006
Messages : 468
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 468
Points : 11
Points : 11
Ah, je suis vraiment désolé

Je regarde la regarde la requete et je reply

guigui69
guigui69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2011, 18h27   #19
Candidat au titre de Membre du Club
 
Inscription : octobre 2006
Messages : 468
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 468
Points : 11
Points : 11
Bonjour,

Je me suis mi pendant 1heure sur la requête mais j'ai un message d'erreur pas rapport au GROUP
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
 
SELECT	societe
	, atelier
	, SUM(somme) AS final_somme
FROM	(
		SELECT		(
					SELECT		COALESCE (SUM(F.Tiempopasado), 0)
					FROM		dbo.ttotfichado AS F
					INNER JOIN	dbo.ttOTIntervencion AS I 
								ON I.Emp = F.Emp
								AND I.Intervencion = F.Intervencion
					WHERE		F.hayabono <> 1
					AND		(
								NOT (
									F.RepartoPendiente = 0
									AND F.FichajeContraOT > 0
								)
								OR F.RepartoPendiente IS NULL
							)
					AND		I.Numinterno = F.Numinterno
					AND		F.fecha <= '12-1-2011 23:59:59.000'
				) AS somme
				, COUNT(DISTINCT TCab.NumOT)
				, SUM
				(
					CASE L.tipocab
						WHEN 0 THEN CASE L.tipolinea
									WHEN 1 THEN CASE I.esabono
											WHEN 1 THEN (-1 * L.PrecioCosteMedio * COALESCE(CL.cantidadhoras, L.cantidadhoras))
											ELSE L.PrecioCosteMedio * COALESCE(CL.cantidadhoras, L.cantidadhoras)
										END
									ELSE 0
							END	
						ELSE 0
					END
				) AS ImpPCPMrec,
				 T.descrip AS atelier
				, E.razon AS societe  
		FROM		dbo.ttotcab AS TCab
		INNER JOIN	dbo.tgempresa AS E
					ON TCab.emp = E.emp 
		INNER JOIN	dbo.tgtaller AS T
					ON TCab.emp = T.emp 
					AND TCab.taller = T.taller
		INNER JOIN	dbo.ttOTIntervencion AS I
					ON TCab.Emp = I.Emp
					AND TCab.NumInterno = I.Numinterno 
		INNER JOIN	dbo.ttOTLinea AS L
					ON I.Emp = L.Emp 
					AND I.Numinterno = L.NumIntOT 
					AND I.Intervencion = L.NumIntIntervencion 
		INNER JOIN	dbo.ttSeccion AS S1
					ON TCab.Seccion = S1.Seccion 
		INNER JOIN	dbo.ttSeccion AS S2
					ON I.Seccion = S2.Seccion 
		LEFT JOIN	dbo.TTrecepcionista AS R
					ON TCab.emp = R.emp 
					AND TCab.taller = R.taller 
					AND TCab.recepcionista = R.recepcionista
		LEFT JOIN	dbo.Tgmarca AS M
					ON TCab.marca = M.marca
					AND L.Marca = M.Marca
		LEFT JOIN	dbo.ttOTCargoLinea AS CL
					ON L.Emp = CL.Emp
					AND L.NumIntOT = CL.NumIntOT 
					AND L.NumIntIntervencion = CL.NumIntIntervencion 
					AND L.LineaItem = CL.LineaItem 
		LEFT JOIN	dbo.ttOTCargoInt AS CI
					ON CL.Emp = CI.emp
					AND CL.NumIntOT = CI.Numintot
					AND CL.NumIntIntervencion = CI.numintintervencion 
					AND CL.NumIntcargo = CI.numintcargo 
		LEFT JOIN	dbo.ttotcargo AS C
					ON CI.emp = C.emp
					AND CI.NumIntOT = C.NumInterno 
					AND CI.NumIntCargo = C.Cargo 
		LEFT JOIN	dbo.ttgrupocargo GC 
					ON C.grupocargo = GC.grupo
		LEFT JOIN	dbo.tgGrupoCont AS GCT
					ON L.GrupoCont = GCT.GrupoCont
		LEFT JOIN	dbo.tacategoriapieza CP
					ON L.marca = CP.marca
					AND L.codigocategoria = CP.codigo
		LEFT JOIN	dbo.ttotstatus AS S
					ON TCab.statusencurso = S.Codigo
		WHERE		TCab.emp = '002'
		AND		I.hayfactura = 0
		AND		TCab.taller = '20'
		AND		TCab.Anulada = 0
		AND		L.Anulada = 0
		AND		TCab.FechaAperturaOT <= '12-1-2011 23:59:59.000'
		AND		(
					L.FechaAlta <= '12-1-2011 23:59:59.000'
					OR L.tipocab = 1
				)
		AND 		L.tipocab <> 2
		AND		TCab.STATUS = 30 
		AND		(
					L.cantidadhoras <> 0
					OR L.almservido <> 1
				)
		GROUP BY	G.razon, T.descrip
	)
GROUP	BY societe, atelier
Je suis sur qu'il a pas grand chose mais je ne vois pas quoi

Citation:
Synbtaxe incorrect vers le mot clé GROUP
Je pense que c'est au niveau de celui ci: GROUP BY societe, atelier

Ou se trouve l'erreur?

guigui69
guigui69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2011, 18h35   #20
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Vous avez juste oublié de donner un nom à votre sous-table:
Code :
1
2
3
4
5
6
7
8
9
10
		AND 		L.tipocab <> 2
		AND		TCab.STATUS = 30 
		AND		(
					L.cantidadhoras <> 0
					OR L.almservido <> 1
				)
		GROUP BY	G.razon, T.descrip
	)  AS TableOubliee
GROUP	BY societe, atelier
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk 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 19h03.


 
 
 
 
Partenaires

Hébergement Web