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 :

Forcer un nombre minimal de lignes de résultat d'un select!


Sujet :

MS SQL Server

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Janvier 2013
    Messages : 40
    Points : 30
    Points
    30
    Par défaut Forcer un nombre minimal de lignes de résultat d'un select!
    Bonjour
    j'ai une requete qui retourne au maximum 8 ligne de résultats, le souci c'est qu'il me faut absolument 8 ligne .
    en effet ça arrive de pas avoir une ligne " une plateforme qui saute" , j'ai pensé au résultat de AVG qui est égal à Null en cas de division par zéro et du coup la ligne n'est pas affichée
    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
    	select 
    				  case when aid.pikr_nbr = '99' then 'Plateforme' else 'Zone normale' end plate_zone ,
    				  ch.stat_code, 
    				  case
    						when ch.stat_code = 10 then 'Imprimé'
    						when ch.stat_code = 15 then 'En cours de prép.'
    						when ch.stat_code = 20 then 'Préparé'
    						when ch.stat_code = 30 then 'Pesé'
    						when ch.stat_code = 40 then 'Sur manifeste'
    						else '?' end statut_cartons,
    				  count(distinct ch.carton_nbr) nb_cartons, sum(cd.to_be_pakd_units) nb_pieces_a_prelever, sum(cd.units_pakd) nb_pieces_prelevees,
                             -- j'ai pensé a cette partie là 
    			cast(avg(cd.units_pakd*100/nullif (cd.to_be_pakd_units,0))as varchar) avancement	
                            --------  
    			from carton_hdr ch with (nolock), carton_dtl cd with (nolock), alloc_invn_dtl aid with (nolock)
    			where ch.carton_nbr = cd.carton_nbr and aid.carton_nbr = cd.carton_nbr and aid.carton_seq_nbr = cd.carton_seq_nbr
    			and ch.stat_code in (10,15,20,30) -- imprimé / en cours de prépa / préparé / pesé
    			and right(ch.pkt_ctrl_nbr,1) in ('G','P','M','Z')
    			group by  case when aid.pikr_nbr = '99' then 'Plateforme' else 'Zone normale' end, ch.stat_code

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    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 768
    Points : 52 719
    Points
    52 719
    Billets dans le blog
    5
    Par défaut
    En cas de division par zéro une erreur doit être affichée et votre requête doit être abandonnée. La divson par zéro ne doit pas conduire à du NULL. SI c'est le cas votre SGBDR est à mettre à la poubelle !

    Extrait de la norme SQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQLSTATE 22012 : Divide by zero error.
    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/ * * * * *

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    Sans avoir une idée de ta structure de données, on va avoir du mal à t'aider, quelles sont les 8 lignes que tu voudrais avoir avec quelles valeurs.


    Tes jointures ne sont pas normalisées
    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
    select 
    			  case when aid.pikr_nbr = '99' then 'Plateforme' else 'Zone normale' end plate_zone ,
    			  ch.stat_code, 
    			  case
    					when ch.stat_code = 10 then 'Imprimé'
    					when ch.stat_code = 15 then 'En cours de prép.'
    					when ch.stat_code = 20 then 'Préparé'
    					when ch.stat_code = 30 then 'Pesé'
    					when ch.stat_code = 40 then 'Sur manifeste'
    					else '?' end statut_cartons,
    			  count(distinct ch.carton_nbr) nb_cartons, sum(cd.to_be_pakd_units) nb_pieces_a_prelever, sum(cd.units_pakd) nb_pieces_prelevees,
                         -- j'ai pensé a cette partie là 
    		cast(avg(cd.units_pakd*100/nullif (cd.to_be_pakd_units,0))as varchar) avancement	
                        --------  
    from carton_hdr ch with (nolock)
    	inner join  carton_dtl cd with (nolock)
    		on ch.carton_nbr = cd.carton_nbr
    	inner join  alloc_invn_dtl aid with (nolock)
    		on	aid.carton_nbr = cd.carton_nbr and aid.carton_seq_nbr = cd.carton_seq_nbr
    where  ch.stat_code in (10,15,20,30) -- imprimé / en cours de prépa / préparé / pesé
    and right(ch.pkt_ctrl_nbr,1) in ('G','P','M','Z')
    group by  case when aid.pikr_nbr = '99' then 'Plateforme' else 'Zone normale' end, ch.stat_code
    Vu ta clause where je ne vois pas comment tu pourrais obtenir un statut_cartons à 'Sur manifeste' ou à ?

    La partie cast(avg(cd.units_pakd*100/nullif (cd.to_be_pakd_units,0))as varchar) avancement à laquelle tu penses ne t'empêchera pas d'avoir des lignes, au pire avancement sera à null.
    Pourquoi tu cast avancement en varchar? ça resemble à un pourcentage donc à decimal pour moi.
    Il me semble que varchar correspond à varchar(1) ce qui n'est pas forcément ce que tu souhaites.
    En revanche tu n'auras pas de lignes s'il n'y a pas de correspondances dans tes tables pour cette plateforme ou ce stat_cod.

    Pour avoir toutes les lignes il te faudrait faire des jointures externes avec quelque chose comme ça
    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
    With MesStatCode as 
    (
    	select 10 as statCode,'Imprimé' status_libelle
    	union
    	select 15 as statCode,'En cours de prép.' status_libelle
    	union
    	select 20 as statCode,'Préparé' status_libelle
    	union
    	select 30 as statCode,'Pesé' status_libelle
    ),
    PlateZones As
    (
    	Select 'Plateforme' as plate_zone,
    	union 
    	select 'Zone normale' as plate_zone
    )
    Select PZ.plate_zone,
    SC.statCode as stat_code,
    SC.status_libelle as statut_cartons,
    nb_cartons,
    nb_pieces_a_prelever,
    nb_pieces_prelevees,
    avancement
    from MesStatCode SC
    cross join PlateZones PZ
    left outer join
    (
    select 
    	case when aid.pikr_nbr = '99' then 'Plateforme' else 'Zone normale' end plate_zone ,
    	ch.stat_code, 
    	count(distinct ch.carton_nbr) nb_cartons,
    	sum(cd.to_be_pakd_units) nb_pieces_a_prelever, sum(cd.units_pakd) nb_pieces_prelevees,
     
    	avg(cd.units_pakd*100/nullif (cd.to_be_pakd_units,0) avancement	 
    from carton_hdr ch with (nolock)
    	inner join  carton_dtl cd with (nolock)
    		on ch.carton_nbr = cd.carton_nbr
    	inner join  alloc_invn_dtl aid with (nolock)
    		on	aid.carton_nbr = cd.carton_nbr and aid.carton_seq_nbr = cd.carton_seq_nbr
    where  ch.stat_code in (10,15,20,30) -- imprimé / en cours de prépa / préparé / pesé
    and right(ch.pkt_ctrl_nbr,1) in ('G','P','M','Z')
    group by  case when aid.pikr_nbr = '99' then 'Plateforme' else 'Zone normale' end, ch.stat_code
     
    ) as T
    on SC.statCode=T.stat_code
    and PZ.plate_zone=T.plate_zone

    Les deux CTE peuvent /doivent être remplacées par des vrais tables si elles existent.
    Cordialement
    Soazig

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2008
    Messages
    698
    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 : 698
    Points : 586
    Points
    586
    Par défaut
    Un select top 8 sur une union de votre requête et de 8 lignes vides fera l'affaire

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Janvier 2013
    Messages : 40
    Points : 30
    Points
    30
    Par défaut
    la solution que j'ai mis en plus est bien une union avec 8 ligne vides et ça marche! merci

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

Discussions similaires

  1. Modification du nombre de lignes du résultat
    Par fabigol dans le forum SQL
    Réponses: 5
    Dernier message: 28/06/2015, 22h50
  2. Réponses: 15
    Dernier message: 16/07/2014, 14h06
  3. Réponses: 5
    Dernier message: 27/09/2013, 13h16
  4. [Toutes versions] Ajouter un ligne de résultat à une requête SELECT
    Par damsmut dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 15/11/2010, 15h01
  5. Limiter le nombre des lignes en résultat
    Par Grand sorcier dans le forum Oracle
    Réponses: 1
    Dernier message: 11/07/2006, 14h30

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