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

Administration SQL Server Discussion :

Requête sur nombre de lignes par table avec un where sur un flag [2012]


Sujet :

Administration SQL Server

  1. #1
    Membre régulier
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Août 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2014
    Messages : 103
    Points : 118
    Points
    118
    Par défaut Requête sur nombre de lignes par table avec un where sur un flag
    Bonjour à tous,

    Le titre n'était pas très parlant, je vais détailler un peu mon pb.

    J'ai un certains nombres de tables des rejets dont j'aimerais connaître la volumétrie en nombre de lignes et par type de rejets.

    Grâce à une requête que j'ai trouvé, je peux déjà avoir l'info du nombre de lignes dans chaque tables de rejets par base (cf. requête ci dessous)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT sc.name +'.'+ ta.name TableName
     ,SUM(pa.rows) RowCnt
     FROM sys.tables ta
     INNER JOIN sys.partitions pa
     ON pa.OBJECT_ID = ta.OBJECT_ID
     INNER JOIN sys.schemas sc
     ON ta.schema_id = sc.schema_id
     WHERE ta.is_ms_shipped = 0 AND pa.index_id IN (1,0)
     GROUP BY sc.name,ta.name
     ORDER BY SUM(pa.rows) DESC
    Je m'appuie sur les vues systèmes pour avoir ses infos, mais étant débutant dans l'utilisation de ce genre de choses je pe trouve un peu perdu quand il faut ajouter le where sur la colonne qui flag mon type de rejet. Je n'arrive pas à voir comment joindre la sys.columns au reste de la requête ci-dessus. pour pouvoir faire un where sur une colonne précise.

    EN espérant avoir été assez clair, je vous remercie d'avance pour le coup de main.

    Slaveak

  2. #2
    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
    Bonjour,

    vous pouvez faire la jointure sur la colonne object_id :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    INNER JOIN sys.columns  co
    ON co.object_id = ta.object_id

    Attention toutefois, cela va multiplier le nombre de lignes par le nombre de colonne dans chaque table, faussant votre somme. En fonction de ce que vous voulez faire, il faudra peut etre faire le regroupement dans une sous requête.

  3. #3
    Membre régulier
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Août 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2014
    Messages : 103
    Points : 118
    Points
    118
    Par défaut
    Ah merci, je teste ça et je vous fait un retour.

    EDIT: Effectivement ça multiplie les lignes, mais pour le coup j'ai ajouté un where sur le nom de mon flag et je retrouve le bon nombre de lignes. Maintenant je vais me débrouiller pour faire les sum() sur mes types de flag différents.

    EDIT 2 : En fait je n'arrive pas au résultat souhaité. Je vais reformuler afin que vous puissiez mieux voir ce que je veux faire.

    En gros je veux obtenir un résultat comme à peu près ce qu'il y a dessous

    Nom_Table | Total ligne | Nb Flag 1 | Nb Flag 2 | Nb Flag 3
    RJT_FACTURE 117 83 33 1

    Sachant que j'aimerais que si j'ajoute une table de rejet, elle soit directement intégrée et que si il y a un nombre variable de flag, j'ai quoi qu'il arrive une colonne par flag.

    Je pensais tirer la liste des tables qu'il me fallait via la première requête que j'ai, mais ensuite, je ne sais pas trop quoi faire de cette liste de tables...
    Il faut que j'en passe par une procédure / fonction ? (je ne suis pas du tout un spécialiste de la chose, mais alors pas du tout ... )

    En tout cas merci d'avances pour le coup de main !

    Slaveak

  4. #4
    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,

    Cela n'est pas possible sans interroger la table elle-même.
    Si vous n'avez pas besoin du nombre de lignes exact, mais simplement d'avoir une idée presque précise du nombre de lignes, vous pouvez utiliser le niveau d'isolation READ UNCOMMITTED :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
     
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
     
    SELECT	'laTable' AS table_name
    	, flag
    	, COUNT(*) AS nb_flag
    FROM	dbo.laTable
    GROUP	BY flag  WITH ROLLUP
    Si vous avez besoin de réaliser ce comptage sur plusieurs tables, vous pouvez utiliser l'opérateur UNION :

    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
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
     
    	SELECT	'laTable' AS table_name
    		, flag
    		, COUNT(*) AS nb_flag
    	FROM	dbo.laTable
    	GROUP	BY flag WITH ROLLUP
    UNION ALL
    	SELECT	'uneAutreTable' AS table_name
    		, flag
    		, COUNT(*) AS nb_flag
    	FROM	dbo.uneAutreTable
    	GROUP	BY flag WITH ROLLUP
    UNION ALL
    	SELECT	'encoreUneAutreTable' AS table_name
    		, flag
    		, COUNT(*) AS nb_flag
    	FROM	dbo.encoreUneAutreTable
    	GROUP	BY flag WITH ROLLUP
    Si vous avez besoin de connaître avec précision le nombre de lignes pour chaque valeur de flag, vous pouvez cr&er une vue indexée à partir de ces requêtes, puis interroger la vue.
    Les vues indexées sont particulièrement efficaces pour le calcul d'agrégats.

    @++

  5. #5
    Membre régulier
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Août 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2014
    Messages : 103
    Points : 118
    Points
    118
    Par défaut
    Bonjour,

    Effectivement c'est ce que nous avons fait. Merci pour le temps que vous m'avez accordé

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

Discussions similaires

  1. Optimisation requête avec Group BY sur 600 000 lignes
    Par kimaidou dans le forum Requêtes
    Réponses: 3
    Dernier message: 05/03/2011, 13h01
  2. Réponses: 6
    Dernier message: 31/05/2010, 16h28
  3. Requête complexe avec plusieurs lignes par table
    Par Iwazaru dans le forum Requêtes
    Réponses: 5
    Dernier message: 01/09/2009, 09h46
  4. Nombre total de lignes par table
    Par atporfi dans le forum Administration
    Réponses: 13
    Dernier message: 24/11/2007, 11h03
  5. Nombre de ligne par défaut sur un Picklist
    Par ranandria dans le forum Delphi
    Réponses: 1
    Dernier message: 02/04/2007, 13h50

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