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 17/12/2011, 02h40   #1
Membre du Club
 
Inscription : octobre 2007
Messages : 160
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 160
Points : 46
Points : 46
Par défaut condition avec un alias

Bonjour

je n'arrive pas à faire une condition avec un alias, est ce qu'il y a d'autre moyen pour le faire?
Code :
1
2
3
4
5
6
7
8
9
 
SELECT count(Statut_Contact) 'nbre', substring(date_derniere_modification,1,11) 'date_mod', Statut_Contact,
dom_dom_id,dom_id FROM questionnaire
INNER JOIN tmk_domaine ON dom_lib=Statut_Contact
	  WHERE substring(date_derniere_modification,1,11) BETWEEN @dd  AND @df AND code_fichier=@code
 GROUP BY  Statut_Contact,date_mod,dom_dom_id,dom_id
 
--Msg 207, Level 16, State 1, Procedure total, Line 9
--Invalid column name 'date_mod'.

merci pour votre aide
nabilfaouzi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2011, 13h08   #2
Modérateur

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

Tout d'abord à mon sens un nom de colonne de résultat n'étant pas une valeur, il ne doit pas être entre quotes.
Ensuite les alias de colonnes ne sont utilisables que dans la clause ORDER BY d'une requête, parce que l'ordre de traitement d'une requête par le processeur de requêtes est le suivant :

1. Lecture de la clause FROM
2. Lecture des clauses JOIN et APPLY
3. Lecture de la clause WHERE/AND
4. Lecture de la clause GROUP BY
5. Lecture de la clause HAVING
5. Lecture de la clause SELECT
6. Lecture de la clause ORDER BY

Entre chaque étape, une table virtuelle est créée sur la base des statistiques de colonne.
On voit que la lecture de la clause SELECT intervient presque en tout dernier, et surtout après la lecture de la clause GROUP BY
Ceci fait que le processeur de requête ne connaît pas encore le nom des colonnes du résultat à produire lorsqu'il lit la clause GROUP BY.
Donc il ne peut pas interpréter votre instruction.
En revanche tout se passerait bien si vous utilisiez ces alias de colonne dans la clause ORDER BY.

En outre je subodore que la colonne date_derniere_modification est d'un des types de données chaîne, ce qui est une très mauvaise idée, et vous a conduit à écrire ceci :

Code :
WHERE		SUBSTRING(date_derniere_modification, 1, 11) BETWEEN @dd AND @df
Sachez que l'application d'une fonction sur une colonne, qu'elle soit native ou définie par l'utilisateur, dans une clause de jointure ou de filtrage, empêche SQL Server d'estimer le nombre de lignes qui correspondent à votre prédicat (sauf si une colonne calculée existe sur la table et que sa définition est exactement la même que le prédicat, et qu'elle est indexée).
Dans le plupart des cas avec ce type de prédicat, l'optimiseur de requête n'a donc d'autre choix que celui de lire toute la table ...

De plus et si je ne me suis pas trompé, cela vous empêche d'utiliser toute fonction native de date, ce qui ne facilitera jamais l'écriture des requêtes, et par conséquent les performances.

@++
__________________
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 19/12/2011, 00h04   #3
Membre du Club
 
Inscription : octobre 2007
Messages : 160
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 160
Points : 46
Points : 46
je te remercie pour tes extraordinaire explication c'est vraiment un honneur que je participe avec vous dans ce forum

A propos de mon sujet, j'ai séparé la date et l'heure de la colonne date_modification afin de rendre les requête plus rapide ainsi de faciliter le développement que je suis en train de manipuler
encore grand merci
nabilfaouzi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 15h04   #4
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 670
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 670
Points : 8 732
Points : 8 732
Citation:
j'ai séparé la date et l'heure de la colonne date_modification afin de rendre les requête plus rapide ainsi de faciliter le développement
Si vous êtes sous SQL Server 2008, vous pouvez utiliser le type date pour stocker la date, et le type time(0) pour stocker une heure.
Si vous n'êtes pas dans cette version, stockez les dates en mettant l'heure à zéro, et l'heure en nombre de minutes ou de secondes selon la précision dont vous avez besoin.

En plaçant les bons index, ça devrait rouster

@++
__________________
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é Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h59.


 
 
 
 
Partenaires

Hébergement Web