IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Requête SQL pour ACCESS problème de compatibilité pour certaines instructions ?


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Homme Profil pro
    Etudiant - Toulouse
    Inscrit en
    Avril 2017
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Etudiant - Toulouse

    Informations forums :
    Inscription : Avril 2017
    Messages : 57
    Points : 42
    Points
    42
    Par défaut Requête SQL pour ACCESS problème de compatibilité pour certaines instructions ?
    Bonjour à toutes et à tous,

    Je rencontre un problème lors de la compilation d'un code SQL,
    mais étant sûr de l'orthographe de ma requête je pense que c'est un problème de compatibilité car je le travail sous ACCESS.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT *, COUNT(DISTINCT date_1), MAX(date_1), MIN(date_1)
    FROM ma_table 
    WHERE date_1 LIKE '%blablabla%' 
    GROUP BY colonne1, colonne2
    Et il me renvoie comme message d'erreur :

    - "Fonction 'DISTINCT' non définie dans l'expression."
    quand je met des parenthèses à date ----> COUNT(DISTINCT (date_1))

    - "Erreur de syntaxe (opérateur absent) dans l'expression 'COUNT(DISTINCT date_1)'."
    quand il n'y a pas les parenthèses ----> COUNT(DISTINCT date_1)

    Je n'ai pas trouver de topiques traitant de ce sujet.
    Pouvez-vous m'en dire plus, avez-vous des idées à propos de ce genre de problème ?

    En vous remerciant d'avance.

    ps : date_1 est tout simplement une colonne alimenté de date.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 789
    Points
    30 789
    Par défaut
    Je n'ai pas bien compris :
    C'est une requête qui fonctionne sous Access mais pas SQL Server ?
    C'est une requête qui fonctionne sous SQL Server mais pas Access ?
    C'est une requête exécutée depuis Access sur une base SQL Server ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre du Club
    Homme Profil pro
    Etudiant - Toulouse
    Inscrit en
    Avril 2017
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Etudiant - Toulouse

    Informations forums :
    Inscription : Avril 2017
    Messages : 57
    Points : 42
    Points
    42
    Par défaut
    Bonjour,

    Je travail sous VBA, cette requête a pour but d'alimenter un RecordSet depuis des données enregistrées sous ACCESS.
    La requête fonctionne avec SQL SERVER (j'ai tester pour être sûr de la syntaxe) mais elle ne fonctionne pas en tant que requête sur ma table ACCESS.

  4. #4
    Membre du Club
    Homme Profil pro
    Etudiant - Toulouse
    Inscrit en
    Avril 2017
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Etudiant - Toulouse

    Informations forums :
    Inscription : Avril 2017
    Messages : 57
    Points : 42
    Points
    42
    Par défaut
    Je viens d'essayer ma requête en enlevant le GROUP BY et les DISTINCT, MAX, MIN et tout fonctionne parfaitement, d'où l'idée que je pense que ACCESS ne prend pas en compte ces instructions.

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 761
    Points : 52 547
    Points
    52 547
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par v4ss73r Voir le message
    - "Fonction 'DISTINCT' non définie dans l'expression."
    quand je met des parenthèses à date ----> COUNT(DISTINCT (date_1))
    DISTINCT n'est pas une fonction. Donc cette syntaxe est illégale.
    - "Erreur de syntaxe (opérateur absent) dans l'expression 'COUNT(DISTINCT date_1)'."
    quand il n'y a pas les parenthèses ----> COUNT(DISTINCT date_1)
    Cette syntaxe est en revanche parfaitement légale.
    Je n'ai pas trouver de topiques traitant de ce sujet.
    Pouvez-vous m'en dire plus, avez-vous des idées à propos de ce genre de problème ?

    En vous remerciant d'avance.

    ps : date_1 est tout simplement une colonne alimenté de date.
    ACCESS dispose d'un niveau de SQL rudimentaire et peu normatif au contraire de SQL Server....

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    Membre du Club
    Homme Profil pro
    Etudiant - Toulouse
    Inscrit en
    Avril 2017
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Etudiant - Toulouse

    Informations forums :
    Inscription : Avril 2017
    Messages : 57
    Points : 42
    Points
    42
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT colonne1, colonne2, count(date_1), Min(date_1), Max(date_1) 
    FROM ma_table
    WHERE date_1 like '%blablabla%'
    GROUP BY colonne1, colonne2
    J'ai trouvé cette solution si quelqu'un rencontre le même problème, il y avait un soucis au niveaux du SELECT * à la place il faut mettre les mêmes colonnes que ton GROUP BY et préférer COUNT * à COUNT(DISTINCT(date_1) car la double instruction ne marche apparemment pas.

    A plus

  7. #7
    Membre du Club
    Homme Profil pro
    Etudiant - Toulouse
    Inscrit en
    Avril 2017
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Etudiant - Toulouse

    Informations forums :
    Inscription : Avril 2017
    Messages : 57
    Points : 42
    Points
    42
    Par défaut
    Je viens de voir ta réponse un peu tard, merci d'avoir pris le temps de répondre en tout cas je comprends mieux pourquoi ce code n'avait pas fonctionné.
    Bonne soirée

  8. #8
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Points : 1 668
    Points
    1 668
    Billets dans le blog
    8
    Par défaut
    Citation Envoyé par v4ss73r Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT colonne1, colonne2, count(date_1), Min(date_1), Max(date_1) 
    FROM ma_table
    WHERE date_1 like '%blablabla%'
    GROUP BY colonne1, colonne2
    J'ai trouvé cette solution si quelqu'un rencontre le même problème, il y avait un soucis au niveaux du SELECT * à la place il faut mettre les mêmes colonnes que ton GROUP BY et préférer COUNT * à COUNT(DISTINCT(date_1) car la double instruction ne marche apparemment pas.

    A plus
    Je suis désolé, mais votre solution est à bannir !
    Résoudre des problèmes d'ordre syntaxique SQL c'est une chose, finir avec des régressions fonctionnelles, c'est empirer la situation !
    En effet, les 2 clauses SELECT, ci-dessous, sur le plan purement fonctionnel, ne donneront pas forcément le même résultat, notamment pour la 3ème colonne ( COUNT(date_1) vs COUNT(DISTINCT date_1) ) !!!
    Leur résultat sera identique uniquement, si par exemple, la colonne date1 est NOT NULL et représente une clé unique de la table Ma_Table. Est-ce vraiment le cas (?).
    Les résultats pour les colonnes colonne1, colonne2, MAX(date_1), et MIN(date_1) ) seront en revanche exactement identiques pour les deux formes de SELECT.
    Donc attention aux régressions fonctionnelles lors de la traduction sous ACCESS !

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT colonne1, colonne2, COUNT(date_1), MAX(date_1), MIN(date_1)
    FROM ma_table 
    WHERE date_1 LIKE '%blablabla%' 
    GROUP BY colonne1, colonne2

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT colonne1, colonne2, COUNT(DISTINCT date_1), MAX(date_1), MIN(date_1)
    FROM ma_table 
    WHERE date_1 LIKE '%blablabla%' 
    GROUP BY colonne1, colonne2

    A+
    "Une idée mal écrite est une idée fausse !"
    http://hamid-mira.blogspot.com

  9. #9
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 149
    Points : 7 392
    Points
    7 392
    Billets dans le blog
    1
    Par défaut
    Je suis très surpris que la syntaxe de départ fonctionne sous SQL Server.

    Et je suis encore plus surpris que personne n'ait volé dans les plumes de v4ss73r à propos de l'étoile dans son SELECT !

    Cette syntaxe va fonctionner :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT colonne1, colonne2, COUNT(DISTINCT date_1), MAX(date_1), MIN(date_1)
    FROM ma_table 
    WHERE date_1 LIKE '%blablabla%' 
    GROUP BY colonne1, colonne2

    Je suis très surpris que SQL Server laisse passer la syntaxe avec l'étoile...

    -- Edit : au fait, c'est quoi ce LIKE sur une colonne nommée "date_1" ? Me dites pas que vous utilisez un varchar pour stocker une date...
    On ne jouit bien que de ce qu’on partage.

  10. #10
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 149
    Points : 7 392
    Points
    7 392
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Je suis très surpris que la syntaxe de départ fonctionne sous SQL Server.
    Je confirme mes soupçons :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    create database sandbox;
    go
     
    use sandbox;
    go
     
    create table testgroup
    (
    	colonne1 int,
            colonne2 int,
            date1 date
    );
    go
     
    insert into testgroup (colonne1, colonne2, date1) values (1, 1, '01/01/2017'), (1, 1, '01/01/2017'), (1, 1, '01/02/2017'), (1, 1, '05/01/2017'), (1, 2, '01/05/2017'), (1, 2, '01/05/2016'), (2, 2, '01/05/2017'), (2, 2, '05/05/2017'), (2, 2, '01/02/2017'), (2, 2, '18/05/2017');
     
    select *, count(distinct date1), min(date1), max(date1)
    from testgroup
    where year(date1) = 2017
    group by colonne1, colonne2;

    Sans aucune surprise, SQL Server 2016 me hurle à la figure :
    Msg*8120, Niveau*16, État*1, Ligne*17
    La colonne 'testgroup.date1' 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.
    L'étoile inclut la colonne DATE1 qui n'est pas présente dans le GROUP BY...

    En revanche, la syntaxe que je propose passe du premier coup :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select colonne1, colonne2, count(distinct date1) count_distinct, count(*) count_etoile, min(date1) min_date, max(date1) max_date
    from testgroup
    where year(date1) = 2017
    group by colonne1, colonne2;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    colonne1    colonne2    count_distinct count_etoile min_date   max_date
    ----------- ----------- -------------- ------------ ---------- ----------
    1           1           3              4            2017-01-01 2017-02-01
    1           2           1              1            2017-05-01 2017-05-01
    2           2           4              4            2017-02-01 2017-05-18
     
    (3*ligne(s) affectée(s))
    PS: On remarque aussi sans surprise que COUNT(DISTINCT date1) ne donne absolument pas le même résultat que COUNT(*) ou COUNT(date1) !
    On ne jouit bien que de ce qu’on partage.

  11. #11
    Membre du Club
    Homme Profil pro
    Etudiant - Toulouse
    Inscrit en
    Avril 2017
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Etudiant - Toulouse

    Informations forums :
    Inscription : Avril 2017
    Messages : 57
    Points : 42
    Points
    42
    Par défaut
    Premièrement merci pour vos réponses je vais m'empresser d'aller tester tout cela pour voir effectivement les différences avec la "solution" que j'avais trouvé la veille.

    hmira : Leur résultat sera identique uniquement, si par exemple, la colonne date1 est NOT NULL et représente une clé unique de la table Ma_Table. Est-ce vraiment le cas (?).
    Les résultats pour les colonnes colonne1, colonne2, MAX(date_1), et MIN(date_1) ) seront en revanche exactement identiques pour les deux formes de SELECT.
    Donc attention aux régressions fonctionnelles lors de la traduction sous ACCESS !
    Dans une de mes condition WHERE la colonne date1 ne prend bien que les NOT NULL mais effectivement elle ne représente pas une clé primaire.
    Merci pour le conseil, je ne m'attendais pas à avoir différentes syntaxes pour SQL Server et pour SQL sous ACCESS.


    StringBuilder : -- Edit : au fait, c'est quoi ce LIKE sur une colonne nommée "date_1" ? Me dites pas que vous utilisez un varchar pour stocker une date...
    Alors non j'ai stocker la date sous un format DATE, le LIKE me permet de prendre les dates finissant pas l'année d'aujourd'hui car stocker sous la forme "DD/MM/YYYY"
    mais je viens de remarquer que dans ton code tu utilises la fonction YEAR(date_1) je vais donc mettre à jour.

    Merci à vous deux pour ces réponses très instructives une bonne journée à vous et merci d'avoir pris le temps de répondre. Je vous retiendrai au courant des résultats, qui à mon avis seront nickel

  12. #12
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Citation Envoyé par v4ss73r Voir le message
    Alors non j'ai stocker la date sous un format DATE, le LIKE me permet de prendre les dates finissant pas l'année d'aujourd'hui car stocker sous la forme "DD/MM/YYYY"
    mais je viens de remarquer que dans ton code tu utilises la fonction YEAR(date_1) je vais donc mettre à jour.
    Vous confondez format de stockage interne à la base de données, et format de restitution.
    Dans la BDD il n'y a aucun séparateur dans les colonnes de type date

    L'opérateur LIKE ne peut s'appliquer que sur une colonne de type (var)char !
    Si vous voulez la liste des lignes dont la date est comprise dans une plage, il faut utiliser BETWEEN ou YEAR comme proposé plus haut

  13. #13
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 761
    Points : 52 547
    Points
    52 547
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par v4ss73r Voir le message
    Alors non j'ai stocker la date sous un format DATE, le LIKE me permet de prendre les dates finissant pas l'année d'aujourd'hui car stocker sous la forme "DD/MM/YYYY"
    Dans les bases de données relationnelles les données sont FORTEMENT typées et une date est un type DATE et n'a rien à voir avec une chaine de caractères. Utiliser un opérateur de chaine sur un type de données autre qu'une chaine de caractères va donner un résultat hasardeux (dépendra du transtypage automatique lié à différents paramétrage de session et de serveur) en plus d'être particulièrement stupide !

    Si vous voulez manipuler des dates il faut utiliser des fonctions spéciales ou appliquer les opérateurs génériques comme >, >=, <, <= ou BETWEEN.

    Exemples :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MA_DATE BETWEEN '2017-01-01' AND '2017-12-31' 
    MA_DATE >= '2017-01-01' AND MA_DATE <= '2017-12-31' 
    YEAR(MA_DATE = 2017
    Et pour apprendre le SQL :
    Nom : Couverture SQL Synthex 4e ed - 500.jpg
Affichages : 682
Taille : 77,8 Ko

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Aide pour requête SQL sous Access
    Par la bulle dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 05/05/2009, 08h16
  2. Problème de compatibilité pour mon menu déroulant
    Par tidus_6_9_2 dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 29/01/2008, 14h29
  3. Problême requête SQL dans access..Erreur 3079
    Par DavidGG dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 18/01/2008, 17h48
  4. Problème requêtes SQL sur Access 2007
    Par Moroccan dans le forum VB.NET
    Réponses: 2
    Dernier message: 07/02/2007, 13h29
  5. Problème de compatibilité pour [style="width:100%;] sur
    Par Furius dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 12/01/2006, 17h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo