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 :

Sql Server MIN sur plusieurs champs


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 143
    Points : 55
    Points
    55
    Par défaut Sql Server MIN sur plusieurs champs
    Bonjour,

    Voilà, j'ai des enregistrements en base avec un champs prix1 et un champs prix2.

    J'aimerais recevoir mes enregistrements et le MIN de prix1 et prix2 dans un champs.

    Je ne vois pas trop comment faire cela.

    Merci pour votre aide!

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    332
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2002
    Messages : 332
    Points : 502
    Points
    502
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT CASE
    WHEN prix1 < prix2 THEN prix1 
    ELSE prix2 
    END AS PRIX_MIN
    FROM MaTable

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2008
    Messages
    699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Octobre 2008
    Messages : 699
    Points : 586
    Points
    586
    Par défaut
    Perso je l'ai fait dans une librairie C# pour SQL Server...
    Niveau vitesse je sais pas trop, mais ça fait ce que ça doit.

  4. #4
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    C'est dommage de faire une librairie C# pour avoir un min de 2 valeurs en SQL. Cela oblige à faire un appel externe via une assembly SQL.

    ++

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2008
    Messages
    699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Octobre 2008
    Messages : 699
    Points : 586
    Points
    586
    Par défaut
    Citation Envoyé par mikedavem Voir le message
    C'est dommage de faire une librairie C# pour avoir un min de 2 valeurs en SQL. Cela oblige à faire un appel externe via une assembly SQL.

    ++
    C'est claire, mais la on ne parle pas de performances.

    Et en plus la requête est tellement plus lisible

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par Donpi Voir le message
    Et en plus la requête est tellement plus lisible
    une simple UDF suffit :

    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
     
    ALTER FUNCTION dbo.F_MIN(
    	@a FLOAT, 
    	@b FLOAT
    )
    RETURNS FLOAT
    WITH SCHEMABINDING
    AS
    BEGIN
    	RETURN 
    		CASE 
    			WHEN @a < @b THEN @a 
    			ELSE 	@b 
    		END
    END

  7. #7
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 795
    Points : 3 173
    Points
    3 173
    Par défaut
    C'est claire, mais la on ne parle pas de performances.
    Pour le moment...

    Evitez ce genre de raisonnement vous allez vite vous faire taper dessus...

  8. #8
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,


    C'est claire, mais la on ne parle pas de performances.
    C'est bien le problème de la grande majorité des entreprises qui négligent totalement la qualité de leur modèle et de leur données ... Ensuite il ne leur reste que leur porte-monnaie pour pleurer et recevoir un consultant comme un sauveur ... Consultants, vous avez de beaux jours devant vous !

    D'autre part dans le cas présent, la simplicité du script de Babyneedle est bien plus élevée que de devoir écrire l'assembly, la déployer, et l'utiliser, et ce que l'on soit expérimenté en .NET ou pas.
    Enfin je ne vois pas ce qui justifie une assembly ici : il n'y aucune itération ou calcul sur des chaînes de caractère par exemple ...

    En conclusion, n'utilisez pas l'intégration CLR à toutes les sauces, mais seulement pour réaliser un besoin métier pour lequel le langage SQL n'est pas conçu, ou pour lequel l'implémentation en SQL est possible mais complexe. Dans toute tâche de développement, il est à mon humble avis requis de constamment garder à l'esprit les performances et la maintenabilité.

    Ce que suggère aieeeuuuuu est sympa aussi, cela étant j'aurai plutôt écrit une fonction de table incluse, qui est appelée de façon ensembliste, et pas une fois par ligne du résultat comme les fonctions UDF scalaires :

    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
    USE maDB
    GO
     
    CREATE FUNCTION dbo.F_MIN
    	(
    		@a int
    		, @b int
    	)
    RETURNS TABLE
    AS
    	RETURN SELECT CASE WHEN @a < @b THEN @a ELSE @b END AS min_val
    GO
     
    SELECT		V.number
    		, W.number
    		, MV.min_val
    FROM		master.dbo.spt_values AS V
    INNER JOIN	master.dbo.spt_values AS W
    			ON W.number = V.number - 1
    CROSS APPLY	dbo.F_MIN(V.number, W.number) AS MV
    WHERE		V.type = 'P'
    AND		W.type = 'P'
    @++

  9. #9
    Membre éclairé Avatar de Arkhena
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 552
    Points : 769
    Points
    769
    Par défaut
    Citation Envoyé par elsuket Voir le message
    C'est bien le problème de la grande majorité des entreprises qui négligent totalement la qualité de leur modèle et de leur données ... Ensuite il ne leur reste que leur porte-monnaie pour pleurer et recevoir un consultant comme un sauveur ... Consultants, vous avez de beaux jours devant vous !
    Sauf quand la société en question est un éditeur de progiciel! Dans ce cas c'est le pigeon client qui a acheté le progiciel qui dépense des mille et des cent en audits divers et variés pour demander les modifications nécessaires au bon fonctionnement du bouzin, modifications bien entendu payantes!

  10. #10
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Sauf quand la société en question est un éditeur de progiciel! Dans ce cas c'est le pigeon client qui a acheté le progiciel qui dépense des mille et des cent en audits divers et variés pour demander les modifications nécessaires au bon fonctionnement du bouzin, modifications bien entendu payantes!
    Certes ...

    Encore lundi un audit chez un client possédant NAVISION (bon la version 5 ok...)
    A 1250 euros TTC la journée...

  11. #11
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Ceci étant dit c'est dommage qu'on est pas la requête Alexis35. Ca éviterait de faire des suppositions.

    ++

  12. #12
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par elsuket Voir le message
    Ce que suggère aieeeuuuuu est sympa aussi, cela étant j'aurai plutôt écrit une fonction de table incluse, qui est appelée de façon ensembliste, et pas une fois par ligne du résultat comme les fonctions UDF scalaires :
    Je suis d'accord sur le principe, mais comme la fonction en question ne fait aucune requête sur des tables tierces, les deux méthodes donneront des plans d’exécution identiques, et je trouve que dans ce cas précis la fonction scalaire reste plus lisible.

  13. #13
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2008
    Messages
    699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Octobre 2008
    Messages : 699
    Points : 586
    Points
    586
    Par défaut
    ça grouille de consultants ici dis donc

  14. #14
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Citation Envoyé par aieeeuuuuu
    Je suis d'accord sur le principe, mais comme la fonction en question ne fait aucune requête sur des tables tierces, les deux méthodes donneront des plans d’exécution identiques, et je trouve que dans ce cas précis la fonction scalaire reste plus lisible.
    Je comprends le critère de lisibilité, mais les plans de requête ne montrent pas les exécutions successives de fonctions, donc il est possible que l'on obtienne des plans d'exécutions identiques, bien que j'en doute car la méthode d'exécution est différente (cf plan de requête joint).

    D'autre part, la trace que j'ai prise et qui est en pièce jointe montre plusieurs appels à la fonction scalaire, mais un seul appel à la fonction de table incluse.
    Le lot de requêtes que j'ai utilisé pour cela est :

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    CREATE FUNCTION dbo.F_MIN_INLINE
    	(
    		@a int
    		, @b int
    	)
    RETURNS TABLE
    AS
    	RETURN SELECT CASE WHEN @a < @b THEN @a ELSE @b END AS min_val
    GO
     
    CREATE FUNCTION dbo.F_MIN_SCALAR
    (
    	@a int
    	, @b int
    )
    RETURNS int
    WITH SCHEMABINDING
    AS
    BEGIN
    	RETURN 
    		CASE 
    			WHEN @a < @b THEN @a 
    			ELSE 	@b 
    		END
    END
    GO
     
    SET NOCOUNT ON
    SET STATISTICS TIME ON
    GO
     
    PRINT '-----------------------------------------'
     
    SELECT		V.number
    		, W.number
    		, dbo.F_MIN_SCALAR(V.number, W.number)
    FROM		master.dbo.spt_values AS V
    INNER JOIN	master.dbo.spt_values AS W
    			ON W.number = V.number - 1
    WHERE		V.type = 'P'
    AND		W.type = 'P'
     
    PRINT '-----------------------------------------'
     
    SELECT		V.number
    		, W.number
    		, MV.min_val
    FROM		master.dbo.spt_values AS V
    INNER JOIN	master.dbo.spt_values AS W
    			ON W.number = V.number - 1
    CROSS APPLY	dbo.F_MIN_INLINE(V.number, W.number) AS MV
    WHERE		V.type = 'P'
    AND		W.type = 'P'
    @++
    Fichiers attachés Fichiers attachés

  15. #15
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Je n'ai pas pu ouvrir ta trace, mais je te crois sur parole

    Et je reste d'accord avec toi sur le principe : préférons les fonction incluses au fonctions scalaires autant que faire ce peut...

    Voire même : "évitons les fonctions scalaires"

    Surtout quand je vois que pour une requête telle que celle-ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT 
    		a
    	,	b
    	,	dbo.F_MIN_SCALAR(a,b) as mini1
    	,	dbo.F_MIN_SCALAR(a,b) as mini2
    FROM( VALUES
    	(1,2),
    	(1,2)
    )T(a,b)
    La fonction scalaire, pourtant déterministe, est appelée... quatre fois !

  16. #16
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Moi non plus, la trace ne s'ouvre pas...

  17. #17
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Citation Envoyé par aieeeuuuuu
    Je n'ai pas pu ouvrir ta trace, mais je te crois sur parole
    Citation Envoyé par iberserk
    Moi non plus, la trace ne s'ouvre pas...
    Dingue ça ... Je viens de l'ouvrir avec le Profiler de SQL Server 2012 ...
    Est-ce que vous l'avez ouvert avec cette version aussi ?

    Qu'est-ce que ça donne avec la capture d'écran en pièce jointe ?

    Citation Envoyé par aieeeuuuuu
    Voire même : "évitons les fonctions scalaires"
    Je suis totalement d'accord
    Effectivement la requête que tu donnes est ... bizarre


    @++
    Images attachées Images attachées  

  18. #18
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Dingue ça ... Je viens de l'ouvrir avec le Profiler de SQL Server 2012 ...
    Arrête !! dis plutôt que tu voulais nous fourguer un de ces virus de Thaïlande oui !!

    ++

  19. #19
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par elsuket Voir le message
    Dingue ça ... Je viens de l'ouvrir avec le Profiler de SQL Server 2012 ...
    Est-ce que vous l'avez ouvert avec cette version aussi ?
    Non, non, effectivement, je n'avais pas précisé, mais si je n'ai pas pu l'ouvrir, c'est juste parce que je n'ai pas la V2012... j'ai pas les moyens moi

  20. #20
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Citation Envoyé par mikedavem
    Arrête !! dis plutôt que tu voulais nous fourguer un de ces virus de Thaïlande oui !!
    Bon, OK, j'avoue, j'ai reçu un peu de H7N9 de Chine ... T'en veux ?

    Citation Envoyé par aieeeuuuuu
    j'ai pas les moyens moi
    Cela étant je n'ai pas non plus un Enterprise Edition sur un 80 cores
    La version développeur coûte 40€.

    Trêve de plaisanteries, je marque le sujet comme résolu

    @++

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

Discussions similaires

  1. [VB2005 & SQL SERVER]requête sur plusieurs DB
    Par Kropernic dans le forum Windows Forms
    Réponses: 7
    Dernier message: 04/06/2008, 17h53
  2. SQL : Jointure droite sur plusieurs champs
    Par Platon93 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 19/12/2006, 13h55
  3. [SQL Server] rechercher dans plusieurs champs d'une table
    Par houla! dans le forum Langage SQL
    Réponses: 3
    Dernier message: 23/08/2006, 09h37
  4. [SQL SERVER ] Tri sur plusieurs champs
    Par fantomchris dans le forum Langage SQL
    Réponses: 6
    Dernier message: 27/07/2006, 17h59
  5. [SQL Access] SELECT sur plusieurs Tables et Composer Champs
    Par Giuseppe dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 07/11/2005, 14h00

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