Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
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 02/01/2011, 01h10   #1
Membre régulier
 
Inscription : septembre 2007
Messages : 278
Détails du profil
Informations personnelles :
Âge : 41
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : septembre 2007
Messages : 278
Points : 89
Points : 89
Par défaut query excel depuis sql server

salut le phorum
voilà mon problème
j'ai réalisé via access une BDD avec sql server
a l'aide de formulaire un outil access permet a plusieurs personnes de gérer des appels sortants et entrants
cela fonctionne très bien par contre pour créer des reporting je passe par excel car ce n'est pas une grosse base...
donc j'ai créer mes liens qui vont bien pour relier les tables sql server vers excel
mais si je veux creer une requête avec des conditions cela me met le message
syntaxe incorrecte vers '='
par contre sans condition iif cela fontionne très bien
voici le code utilisé (pour info ce code fonctionne très bien dans access puisque je l'ai pris d'access pour le copier dans le query mais ca bloque)
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT 
T_PLANNING_CLIENT.Num_protocole AS [Numéro Protocole],
T_PROTOCOLE.[Nombre de visites], 
Min(T_PLANNING_CLIENT.Date) AS [Date Début], 
Count(T_PLANNING_CLIENT.Date) AS [Nombre de volontaire demandé],
Sum(IIf(T_PLANNING_CLIENT.[RDV pris]=2,0,T_PLANNING_CLIENT.[RDV pris])) AS [Nombre de volontaire recruté],
Count(T_PLANNING_CLIENT.Date) - Sum(T_PLANNING_CLIENT.[RDV pris]) AS Delta
 
FROM T_PLANNING_CLIENT 
INNER JOIN T_PROTOCOLE ON T_PLANNING_CLIENT.Num_protocole = T_PROTOCOLE.Numéro 
 
WHERE T_PLANNING_CLIENT.Visites = 1 
 
GROUP BY T_PLANNING_CLIENT.Num_protocole, 
T_PROTOCOLE.[Nombre de visites], 
T_PLANNING_CLIENT.Visites,
Sum(IIf(T_PLANNING_CLIENT.[RDV pris]=2,0,T_PLANNING_CLIENT.[RDV pris])) AS [Nombre de volontaire recruté]
 
ORDER BY T_PLANNING_CLIENT.Num_protocole;
merci d'avance pour toutes pistes ou solutions
munity
munity est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2011, 01h35   #2
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 665
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 665
Points : 8 707
Points : 8 707
Bonjour,

10 secondes de recherche vous auraient donné la réponse en utilisant votre moteur de recherche préféré
IIf n'existe pas en SQL, et peut être réécrit en utilisant la clause CASE :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT		PC.Num_protocole AS [Numéro Protocole]
		, P.[Nombre de visites]
		, MIN(PC.Date) AS [Date Début]
		, COUNT(PC.Date) AS [Nombre de volontaire demandé]
		, SUM(CASE C.[RDV pris] WHEN 2 THEN 0 ELSE PC.[RDV pris] END) AS [Nombre de volontaire recruté]
		, COUNT(PC.Date) - SUM(PC.[RDV pris]) AS Delta 
FROM		dbo.PC AS PC
INNER JOIN 	db.T_PROTOCOLE AS P ON PC.Num_protocole = P.Numéro 
WHERE		PC.Visites = 1 
GROUP BY	PC.Num_protocole
		, P.[Nombre de visites]
		, PC.Visites
		, CASE C.[RDV pris] WHEN 2 THEN 0 ELSE PC.[RDV pris] END
ORDER BY 	PC.Num_protocole
En outre, utiliser des noms de colonnes contenant des espaces ou des caractères diacritiques est une très mauvaise idée qui peut vous conduire à de gros problèmes.

@++
__________________
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 02/01/2011, 01h48   #3
Membre régulier
 
Inscription : septembre 2007
Messages : 278
Détails du profil
Informations personnelles :
Âge : 41
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : septembre 2007
Messages : 278
Points : 89
Points : 89
merci pour ta réponse
oui je sais pour les espaces dans les noms de colonnes
je débute en BDD alors un peu de compréhension
siou plé missié
pour la prochaine base de données je le ferais plus
par contre pourquoi cela fonctionne dans access le iif
ou tu vas me dire que cela n'a rien a voir mais cela reste du sql ou cela veut dire qu'il y a plusieurs syntaxe en sql...
ben si c'est le cas c'est pas gagné pour moi....
Ah oui je me suis permis de corriger ton code il y avait des erreurs (travail d'amateur... )
Citation:
SUM(CASE PC.[RDV pris] WHEN 2 THEN 0 ELSE PC.[RDV pris] END) AS
en tout cas un grand merci à toi en ce premier jour de l'an de grace 2011
munity
munity est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2011, 02h18   #4
Membre régulier
 
Inscription : septembre 2007
Messages : 278
Détails du profil
Informations personnelles :
Âge : 41
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : septembre 2007
Messages : 278
Points : 89
Points : 89
j'aurais encore besoin d'un petit conseil
voici mon code
apparemment la ligne qui contient <= ne passe pas syntaxe erreur sur '<='
je suppose que c'est le meme probleme que pour le '=' mais je ne vois pas trop quel opérateur on peut mettre pour un inférieur ou égal
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SELECT		PC.Num_protocole AS [Numéro Protocole]
		, P.[Nombre de visites]
		, MIN(PC.Date) AS [Date Début]
		, COUNT(PC.Date) AS [Nombre de volontaire demandé]
		, SUM(CASE PC.[RDV pris] WHEN 2 THEN 0 ELSE PC.[RDV pris] END) AS [Nombre de volontaire recruté]
		, COUNT(PC.Date) - SUM(PC.[RDV pris]) AS Delta 
		, CASE PC.[RDV Pris] 
		WHEN 2 
		THEN "Test Annulé" 
		WHEN PC.[Date] <= now()		THEN "Test en cours" 
		ELSE "Test à planifier" 				
		END AS [Statut du test]				

FROM		dbo.T_PLANNING_CLIENT AS PC				
INNER JOIN 	dbo.T_PROTOCOLE AS P ON PC.Num_protocole = P.Numéro 					
WHERE		PC.Visites = 1 				
GROUP BY	PC.Num_protocole					
		, P.[Nombre de visites]				
		, PC.Visites				
		, CASE PC.[RDV pris] WHEN 2 THEN 0 ELSE PC.[RDV pris] END				
ORDER BY 	PC.Num_protocole
merci en tout cas

munity
munity est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2011, 13h07   #5
Membre régulier
 
Inscription : septembre 2007
Messages : 278
Détails du profil
Informations personnelles :
Âge : 41
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : septembre 2007
Messages : 278
Points : 89
Points : 89
re
bon je pense avoir trouvé pour inclure des opérateurs dans ma requête comme = ou <=
par contre je souhaiterai inclure un test sur une date mais tous les noms que j'indique pour avoir la date du jour m'indique que la fonction n'existe pas voir texte en rouge dans le code
quel est la bonne fonction a employer sachant que j'ai également utilisé
Date()
sysdate()
now()
merci d'avance
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
SELECT 
PC.Num_protocole AS [Numéro Protocole]
, P.[Nombre de visites]
, MIN(PC.Date) AS [Date Début]
, COUNT(PC.Date) AS [Nombre de volontaire demandé]
, SUM(CASE PC.[RDV pris] WHEN 2 THEN 0 ELSE PC.[RDV pris] END) AS [Nombre de volontaire recruté]
, COUNT(PC.Date) - SUM(CASE PC.[RDV pris] WHEN 2 THEN 0 ELSE PC.[RDV pris] END) AS Delta 
, CASE 
WHEN PC.[RDV Pris]= 2 THEN 'Test Annulé' 
WHEN MIN(PC.Date) <= CURDATE() THEN 'Test en cours'
ELSE 'Test à planifier' 
END as [Statut Test]

FROM dbo.T_PLANNING_CLIENT AS PC
INNER JOIN dbo.T_PROTOCOLE AS P ON PC.Num_protocole = P.Numéro 

WHERE		PC.Visites = 1 

GROUP BY 
PC.Num_protocole
, P.[Nombre de visites]
, PC.Visites
, CASE 
WHEN PC.[RDV Pris]= 2 THEN 'Test Annulé'  
WHEN MIN(PC.Date) <= CURDATE() THEN 'Test en cours'
ELSE 'Test à planifier' END

ORDER BY PC.Num_protocole
munity est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2011, 13h48   #6
Membre régulier
 
Inscription : septembre 2007
Messages : 278
Détails du profil
Informations personnelles :
Âge : 41
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : septembre 2007
Messages : 278
Points : 89
Points : 89
J'ai trouvé la solution il faut mettre GETDATE().
munity est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2011, 00h06   #7
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 665
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 665
Points : 8 707
Points : 8 707
Désolé de ne pas t'avoir guidé pour la suite, c'est cool que tu aies trouvé.
Bonne Année à toi aussi

Citation:
ou tu vas me dire que cela n'a rien a voir mais cela reste du sql ou cela veut dire qu'il y a plusieurs syntaxe en sql...
Effectivement la fonction IIf n'existe pas dans la norme SQL, donc ce qu'utilise Access est un mélange de SQL et de VB, c'est à dire ni l'un, ni l'autre.

Tu peux télécharger la documentation de SQL Server, qui contient celle de T-SQL, l'implémentation de SQL dans SQL Server.

@++
__________________
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 03/01/2011, 09h11   #8
Membre régulier
 
Inscription : septembre 2007
Messages : 278
Détails du profil
Informations personnelles :
Âge : 41
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : septembre 2007
Messages : 278
Points : 89
Points : 89
pas de problème
apprendre par soi meme c'est plus enrichissant
merci en tout cas de m'avoir mis sur la piste et de m'avoir aidé
merci aussi pour les liens..

a bientot peut être pour d'autres conseils

munity
munity est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 13h37   #9
Membre régulier
 
Inscription : septembre 2007
Messages : 278
Détails du profil
Informations personnelles :
Âge : 41
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : septembre 2007
Messages : 278
Points : 89
Points : 89
coucou me revoilà avec un petit problème avec le group by
voici mon code
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
SELECT 
PC.Num_protocole AS [Numéro Protocole]
, P.[Nombre de visites]
, MIN(PC.Date) AS [Date Début]
, COUNT(PC.Date) AS [Nombre de volontaire demandé]
, SUM(CASE PC.[RDV pris] WHEN 2 THEN 0 ELSE PC.[RDV pris] END) AS [Nombre de volontaire recruté]
, COUNT(PC.Date) - SUM(CASE PC.[RDV pris] WHEN 2 THEN 0 ELSE PC.[RDV pris] END) AS Delta 
, CASE 
WHEN PC.[RDV Pris]= 2 THEN 'Test Annulé' 
WHEN PC.Date <= GETDATE() THEN 'Test en cours'
WHEN COUNT(PC.Date) - SUM(CASE PC.[RDV pris] WHEN 2 THEN 0 ELSE PC.[RDV pris] END) =0 then 'Test Planifié'
ELSE 'Test à planifier' 
END as [Statut Test]

FROM dbo.T_PLANNING_CLIENT AS PC
INNER JOIN dbo.T_PROTOCOLE AS P ON PC.Num_protocole = P.Numéro 

WHERE PC.Visites = 1 

GROUP BY 
PC.Num_protocole
, P.[Nombre de visites]
, PC.Visites
, PC.Date
, PC.[RDV pris]
,CASE 
WHEN PC.[RDV Pris]= 2 THEN 'Test Annulé' 
WHEN PC.Date <= GETDATE() THEN 'Test en cours'
WHEN (COUNT(PC.Date) - SUM(CASE PC.[RDV pris] WHEN 2 THEN 0 ELSE PC.[RDV pris] END) =0 then 'Test Planifié'
ELSE 'Test à planifier' 
END
ORDER BY PC.Num_protocole
en rouge le bout de code qui plante la requête
si je ne le mets pas il doublonne les informations
Citation:

7506 1 2011-01-06 1 0 1 Test à planifier
7506 1 2011-01-06 17 17 0 Test planifié
je souhaiterai que ces deux lignes ne fassent qu'une
il devrait logiquement agglomerer le 1 et le 17 pour faire 18 pour ne sortir que Test à planifier et non pas test à planifier et test planifié
j'espère être clair...
et si je l'ajoute il m'indique que la syntaxe est incorrecte vers 'then'

pour etre plus clair je voudrai qu'il fasse le group by sur la colonne 'Delta'
mais celle ci n'est pas reconnu message nom de colonne non valide 'Delta'
y aurait il une ame charitable pour aider un débutant sur sql server
meme une piste...
merci d'avance

munity
munity est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 15h09   #10
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 665
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 665
Points : 8 707
Points : 8 707
En fait tu n'as pas besoin de ce CASE dans le GROUP BY.
Le CASE du SELECT te sers simplement à retourner une certaine valeur en fonction d'une règle métier, mais l'agrégat (et non pas "agglomerer" ) est calculé sur les colonnes PC.Date et PC.[RDV pris].
C'est pour cela que tu peux donc éliminer le CASE du GROUP BY, puisque l'expression du GROUP BY contient déjà ces deux colonnes

En outre, pour que l'expression de ta requête soit plus simple, tu peux par exemple en faire une vue, dont le plan d'exécution sera aussi conservée dans le cache
Cela te permettrait donc d'écrire SELECT mesColonnes FROM maVue

@++
__________________
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 04/01/2011, 15h16   #11
Membre régulier
 
Inscription : septembre 2007
Messages : 278
Détails du profil
Informations personnelles :
Âge : 41
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : septembre 2007
Messages : 278
Points : 89
Points : 89
merci de ta réponse
j'ai enlevé le case du group by mais toujours le meme problème de doublons
mais en fait j'avais ajouté le case dans le group by
car mon problème est que pour un meme test je peux avoir des RDV pris à 0 (en attente) et à 1 (validé)
dans mon cas il distingue les 0 et 1 alors que je voudrai qu'il me prenne la variable delta qui est un champ calculé qui me permet de définire le reste à faire pour le test
donc si delta = 0 test planifié sinon test à planifier
c'est ce point qui me bloque
en effet en faisant une vue je pourrais filtrer directement sur le résultat du delta et ainsi obtenir ce que je souhaites
mais juste une question
comment faire pour afficher une vue ?
munity est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 18h05   #12
Membre régulier
 
Inscription : septembre 2007
Messages : 278
Détails du profil
Informations personnelles :
Âge : 41
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : septembre 2007
Messages : 278
Points : 89
Points : 89
bon j'ai fini par trouver
j'ai donc creer une vue dans sql server avec les champs dont j'ai besoin
c'est pas trop évident quand on début mais sql server est plutot ludique avec un peu de recherche et de connerie...
j'ai ensuite importer cette vue et une table pour le test des statuts des RDV
et tout roule
voici mon code
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
 
SELECT 
RQ."Numéro Protocole"
, RQ."Nombre de visites"
, RQ."Date Début"
, RQ."Nombre de volontaire demandé"
, RQ."Nombre de volontaire recruté"
, RQ.Delta
, CASE 
WHEN  T_PLANNING_CLIENT."RDV pris"= 2 THEN 'Test Annulé' 
WHEN RQ."Date Début" <= getdate() THEN 'Test en cours'
WHEN RQ."Delta" = 0 THEN 'Test Planifié'
ELSE 'Test à planifier' 
END AS [Statut Test]
FROM A_L_OREAL.dbo.RQ RQ, A_L_OREAL.dbo.T_PLANNING_CLIENT T_PLANNING_CLIENT
WHERE RQ."Numéro Protocole" = T_PLANNING_CLIENT.Num_protocole AND ((T_PLANNING_CLIENT.Visites=1))
GROUP BY 
RQ."Numéro Protocole"
, RQ."Nombre de visites"
, RQ."Date Début"
, RQ."Nombre de volontaire demandé"
, RQ."Nombre de volontaire recruté"
, RQ.Delta
, CASE 
WHEN  T_PLANNING_CLIENT."RDV pris"= 2 THEN 'Test Annulé' 
WHEN RQ."Date Début" <= getdate() THEN 'Test en cours'
WHEN RQ."Delta" = 0 THEN 'Test Planifié'
ELSE 'Test à planifier' 
END
ORDER BY RQ."Numéro Protocole"
encore merci à elsuket
mais bon comme je commence je risque fort de revenir

munity
munity 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 14h37.


 
 
 
 
Partenaires

Hébergement Web