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

MS SQL Server Discussion :

query excel depuis sql server


Sujet :

MS SQL Server

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    776
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 776
    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 : 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
    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

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

    @++

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    776
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 776
    Par défaut
    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... )
    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

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    776
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 776
    Par défaut
    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 : 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
    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

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    776
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 776
    Par défaut
    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 : 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
    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

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    776
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 776
    Par défaut
    J'ai trouvé la solution il faut mettre GETDATE().

  7. #7
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Désolé de ne pas t'avoir guidé pour la suite, c'est cool que tu aies trouvé.
    Bonne Année à toi aussi

    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.

    @++

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    776
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 776
    Par défaut
    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

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    776
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 776
    Par défaut
    coucou me revoilà avec un petit problème avec le group by
    voici mon code
    Code : 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
    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

    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

  10. #10
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    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

    @++

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    776
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 776
    Par défaut
    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 ?

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    776
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 776
    Par défaut
    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 : 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
    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

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 06/03/2012, 10h53
  2. Importation d'une feuille excel vers sql server 2005
    Par transistor49 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 16/09/2009, 19h31
  3. Importé un fichier excel sous SQL Server 2005
    Par summer91 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 01/05/2006, 10h52
  4. Réponses: 3
    Dernier message: 11/10/2005, 09h46
  5. Exportation automatique Excel vers SQL Server
    Par jhalawa dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 14/07/2005, 11h45

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