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 :

Liste de cinq lignes avec saut de page => outils pour connaitre le nombre de pages ?


Sujet :

Développement SQL Server

  1. #41
    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 FoxDeltaSierra Voir le message
    Concernant cette nouvelle requête, elle ne renvoit aucune ligne (bien qu'aucune erreur), je ne comprend pas trop pourquoi... ?
    Je pense que vous n'avez aucun (ou un seul) saut de page manuel... (colonne DenierVolPAge à 1)

    Essayez cette requête :
    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
    54
     
    ;WITH tmp AS
    (
    	SELECT		id ,
    				jour,
    				DernierVolPage,
    				ROW_NUMBER() OVER(ORDER BY jour, id) AS Rn
    	FROM vols_avion 
    	WHERE id_user=@id_user
    ),
    LastLigne AS(
    	SELECT 
    			Rn,
    			ROW_NUMBER() OVER(ORDER BY RN) AS Ll
    	FROM	tmp
    	WHERE	DernierVolPAge = 1
    		OR RN = (SELECT MAX(RN)  FROM tmp)
    ),
    Blocs AS(
     
     
    	SELECT 
    			COALESCE(Debut.Rn, 1) AS RnDebut,
    			COALESCE(Fin.Rn, (SELECT MAX(Rn) FROM tmp)) AS RnFin,
    			ROW_NUMBER() OVER(ORDER BY Debut.Rn) AS NoBloc 
    	FROM	LastLigne Debut
    	FULL OUTER JOIN LastLigne Fin
    		ON	Fin.Ll = Debut.Ll + 1
     
     
    ), U AS(
    	SELECT 
    		tmp.id,
    			tmp.jour, 
    			(ROW_NUMBER() OVER(PARTITION BY NoBloc ORDER BY Rn) -1) / @NbVolParPage + 1 AS PageRelativeBloc,
    			(ROW_NUMBER() OVER(PARTITION BY NoBloc ORDER BY Rn) -1) % @NbVolParPage +1  AS LignePage,
    			tmp.RN,
    			NoBloc
    	FROM blocs
    	INNER JOIN tmp
    		ON tmp.Rn >blocs.RnDebut
    		AND tmp.Rn <= blocs.Rnfin
    )
     
     
    	SELECT 
    			id,
    			jour, 
    			PageRelativeBloc + COALESCE((SELECT MAX(PageRelativeBloc) FROM U B WHERE NoBloc = A.NoBloc - 1), 0) AS Page,
    			LignePage
    			--RN,
    			--NoBloc
    	FROM U A
    ORDER BY 3,4

  2. #42
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 249
    Points : 95
    Points
    95
    Par défaut
    Ca a vraiment l'air beaucoup plus rapide oui ! A quoi sert le "ORDER BY 3,4" ? Car lorsque je déclare une procédure stockée comme ceci :

    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
    54
    55
    56
    57
    CREATE FUNCTION GetCarnetTest3 (@id_user INT, @NbVolParPage INT)
    RETURNS TABLE
    AS
    RETURN
    WITH tmp AS
    (
    	SELECT		id ,
    				jour,
    				DernierVolPage,
    				ROW_NUMBER() OVER(ORDER BY jour, id) AS Rn
    	FROM vols_avion 
    	WHERE id_user=@id_user
    ),
    LastLigne AS(
    	SELECT 
    			Rn,
    			ROW_NUMBER() OVER(ORDER BY RN) AS Ll
    	FROM	tmp
    	WHERE	DernierVolPAge = 1
    		OR RN = (SELECT MAX(RN)  FROM tmp)
    ),
    Blocs AS(
     
     
    	SELECT 
    			COALESCE(Debut.Rn, 1) AS RnDebut,
    			COALESCE(Fin.Rn, (SELECT MAX(Rn) FROM tmp)) AS RnFin,
    			ROW_NUMBER() OVER(ORDER BY Debut.Rn) AS NoBloc 
    	FROM	LastLigne Debut
    	FULL OUTER JOIN LastLigne Fin
    		ON	Fin.Ll = Debut.Ll + 1
     
     
    ), U AS(
    	SELECT 
    		tmp.id,
    			tmp.jour, 
    			(ROW_NUMBER() OVER(PARTITION BY NoBloc ORDER BY Rn) -1) / @NbVolParPage + 1 AS PageRelativeBloc,
    			(ROW_NUMBER() OVER(PARTITION BY NoBloc ORDER BY Rn) -1) % @NbVolParPage +1  AS LignePage,
    			tmp.RN,
    			NoBloc
    	FROM blocs
    	INNER JOIN tmp
    		ON tmp.Rn >blocs.RnDebut
    		AND tmp.Rn <= blocs.Rnfin
    )
     
     
    	SELECT 
    			id,
    			jour, 
    			PageRelativeBloc + COALESCE((SELECT MAX(PageRelativeBloc) FROM U B WHERE NoBloc = A.NoBloc - 1), 0) AS Page,
    			LignePage
    			--RN,
    			--NoBloc
    	FROM U A
    ORDER BY 3,4
    J'ai une erreur sur ce ORDER BY :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP or FOR XML is also specified.
    Mais lorsque je l'enlève cela fonctionne et les résultats ne semblent pas changer ?

    MERCI encore!
    Vive Visual Studio.net !!!

  3. #43
    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
    Le ORDER BY sert à trier les résultats,

    En l’occurrence, par page, puis par ligne....

    Vous pouvez le retirer sans problème, et vou sle devez même effectivement dans une fonction, comme dans une vue, une sous-requete,...

  4. #44
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 249
    Points : 95
    Points
    95
    Par défaut
    D'accord oui merci je cherchais un lien plus compliqué que ca. Par contre avec votre dernière requête il y a des doublons sur les Numéros de ligne : voici un exemple de résultat renvoyé :

    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
    ID	jour	Page	LignePage
    141043	2007-01-20 00:00:00.000	1	11
    141044	2007-01-27 00:00:00.000	1	12
    141045	2007-02-10 00:00:00.000	1	13
    141046	2007-02-17 00:00:00.000	2	1
    154240	2012-08-30 18:31:49.000	2	1
    141057	2007-04-07 00:00:00.000	2	1
    141058	2007-04-14 00:00:00.000	2	2
    162321	2012-09-11 00:00:00.000	2	2
    141047	2007-02-24 00:00:00.000	2	2
    141048	2007-03-03 00:00:00.000	2	3
    158094	2012-09-28 11:08:21.000	2	3
    141059	2007-04-14 00:00:00.000	2	3
    141060	2007-04-18 00:00:00.000	2	4
    164117	2013-01-23 17:03:15.000	2	4
    141049	2007-03-10 00:00:00.000	2	4
    141050	2007-03-10 00:00:00.000	2	5
    166467	2013-03-16 12:36:39.000	2	5
    141061	2007-04-20 00:00:00.000	2	5
    141062	2007-04-20 00:00:00.000	2	6
    166820	2013-03-24 00:00:00.000	2	6
    141051	2007-03-17 00:00:00.000	2	6
    167197	2013-04-07 00:00:00.000	2	7
    141063	2007-04-28 00:00:00.000	2	7
    141064	2007-04-28 00:00:00.000	2	8
    169359	2013-05-01 00:00:00.000	2	8
    170541	2013-05-11 00:00:00.000	2	9
    141065	2007-05-05 00:00:00.000	2	9
    141066	2007-05-05 00:00:00.000	2	10
    170542	2013-05-11 00:00:00.000	2	10
    141067	2007-05-12 00:00:00.000	2	11
    141068	2007-05-19 00:00:00.000	2	12
    141069	2007-05-26 00:00:00.000	2	13
    141070	2007-06-02 00:00:00.000	3	1
    141052	2007-03-21 00:00:00.000	3	1
    141053	2007-03-24 00:00:00.000	3	2
    141071	2007-06-09 00:00:00.000	3	2
    141072	2007-06-16 00:00:00.000	3	3
    Vive Visual Studio.net !!!

  5. #45
    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
    en effet, il y a une erreur dans la calcul des pages.

    J'ai modifié, ce qui en plus simplifie la requête (une sous requête en moins)

    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
     
    ;WITH tmp AS
    (
    	SELECT		id ,
    				jour,
    				DernierVolPage,
    				ROW_NUMBER() OVER(ORDER BY jour, id) AS Rn
    	FROM vols_avion 
    	WHERE id_user=@id_user
    ),
    LastLigne AS(
    	SELECT 
    			Rn,
    			ROW_NUMBER() OVER(ORDER BY RN) AS Ll
    	FROM	tmp
    	WHERE	DernierVolPAge = 1
    		OR RN = (SELECT MAX(RN)  FROM tmp)
    ),
    Blocs AS(
     
     
    	SELECT 
    			COALESCE(Debut.Rn, 0) AS RnDebut,
    			COALESCE(Fin.Rn, (SELECT MAX(Rn) FROM tmp)) AS RnFin,
    			ROW_NUMBER() OVER(ORDER BY COALESCE(Debut.Rn, 0)) AS NoBloc 
    	FROM	LastLigne Debut
    	FULL OUTER JOIN LastLigne Fin
    		ON	Fin.Ll = Debut.Ll + 1
     
     
    ), U AS(
    	SELECT 
    		tmp.id,
    			tmp.jour, 
    			(ROW_NUMBER() OVER(PARTITION BY NoBloc ORDER BY Rn) -1) / @NbVolParPage + 1 AS PageRelativeBloc,
    			(ROW_NUMBER() OVER(PARTITION BY NoBloc ORDER BY Rn) -1) % @NbVolParPage + 1  AS LignePage,
    			tmp.RN,
    			NoBloc
    	FROM blocs
    	INNER JOIN tmp
    		ON tmp.Rn >blocs.RnDebut
    		AND tmp.Rn <= blocs.Rnfin
    )
    	SELECT 
    			id,
    			jour, 
    			DENSE_RANK() OVER(ORDER BY NoBloc, PAgeRelativeBloc) AS Page,
    			LignePage
    	FROM U

  6. #46
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 249
    Points : 95
    Points
    95
    Par défaut
    Le fonctionnement est parfait par contre niveau temps de réponse cela revient au même qu'avec la requête initiale :S
    Vive Visual Studio.net !!!

  7. #47
    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
    Quel est le temps de réponse ? Combien y a-t-il de lignes dans la table ? combien y a-t-il de sauts de page manuels ?


    Pour optimiser, il faudrait le script de création et de peuplement de la table avec vos données.
    Car certaines requêtes seront plus performantes avec certaines données, mais moins avec d'autres (volume, répartition,...)
    Pouvez vous nous fournir ça ?

    La requête que je vous ai proposée est surement optimisable, mais dans tous les cas, le besoin même de la requête induira des temps de réponses relativement longs.

    Si vous devez appeler souvent cette requête, on pourrait envisager de créer des vues indexées pour au moins "préparer" le travail... mais ça pourrait avoir un impact important sur d'autres requêtes existantes...

    Bref, je pense qu'on arrive aux limites de ce que l'on peut faire à travers un forum, car pour faire mieux, il faudrait connaitre précisément le contexte, quand et comment les données sont mises à jour afin d'envisager d'autres solutions.

Discussions similaires

  1. [XL-2003] Connaitre le nombre de page d'un document word
    Par Krovax dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 07/07/2009, 23h21
  2. [WD-2003] Connaitre le nombre de page d'un document word
    Par Krovax dans le forum VBA Word
    Réponses: 4
    Dernier message: 07/07/2009, 22h23
  3. Connaitre le nombre de page
    Par toblerona dans le forum Rave
    Réponses: 6
    Dernier message: 19/06/2009, 21h01
  4. Réponses: 1
    Dernier message: 28/04/2009, 12h49
  5. Connaitre le nombre de page d'un fichier Word
    Par abbd dans le forum Services Web
    Réponses: 1
    Dernier message: 23/02/2009, 12h26

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