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 :

Compter nombre de lignes


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Novembre 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2009
    Messages : 61
    Par défaut Compter nombre de lignes
    Bonjour,

    J'ai une table Profile, Projet et Items

    A savoir qu'un profile a 1 ou n Projet et qu'un projet a 1 ou n items

    Je souhaite avoir dans une même requête le nombre d'items par projet et le nombre de projet par profile.

    Quand je fais la requete suivante
    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
    SELECT 
    	pf.ProfileId,
    	pj.ProjectId,
    	it.ItemsId
    FROM
    	dbo.Profiles AS pf
     
    LEFT OUTER JOIN
    	dbo.Projects AS pj
    ON
    	pf.ProfileId = pj.ProfileIdFK
    LEFT OUTER JOIN
    	dbo.Items AS it
    ON
    	pj.ProjectId = it.ProjectIdFK
    GROUP BY 
    	pf.ProfileId
    J'ai le résultat suivant
    ProfileId----------ProjectId----------ItemsId
    62-----------------15-------------------23
    62-----------------15-------------------21
    65-----------------16-------------------24
    66----------------NULL----------------NULL

    Maintenant je fais la requete suivante pour avoir le nombre d'items par projet
    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
    SELECT 
    	pf.ProfileId,
    	pj.ProjectId,
    	COUNT (it.ItemsId) AS ["Nombre d'items"]
    FROM
    	dbo.Profiles AS pf
     
    LEFT OUTER JOIN
    	dbo.Projects AS pj
    ON
    	pf.ProfileId = pj.ProfileIdFK
    LEFT OUTER JOIN
    	dbo.Items AS it
    ON
    	pj.ProjectId = it.ProjectIdFK
    GROUP BY 
    	pf.ProfileId,
    	pj.ProjectId
    J'ai le résultat suivant
    ProfileId----------ProjectId----------Nombre d'Items
    ----62-----------------15---------------------2-----------
    ----65-----------------16---------------------1-----------
    ----66----------------NULL------------------NULL-------

    Etmaintenant je souhaite connaitre le nombre de projet avec le nombre d'items par profile, c'est ici que je fais pas la bonne requete, car il me compte 2 fois le projet 15, ce qui est normal parce que je compte aussi le nombre d'items.
    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
    SELECT 
    	pf.ProfileId,
    	COUNT(pj.ProjectId) AS ["Nombre de Projets"],
    	COUNT (it.ItemsId) AS ["Nombre d'Items"]
    FROM
    	dbo.Profiles AS pf
     
    LEFT OUTER JOIN
    	dbo.Projects AS pj
    ON
    	pf.ProfileId = pj.ProfileIdFK
    LEFT OUTER JOIN
    	dbo.Items AS it
    ON
    	pj.ProjectId = it.ProjectIdFK
    GROUP BY 
    	pf.ProfileId
    Le résultat est le suivant
    ProfileId----------Nombre projets----------Nombre d'Items
    ----62--------------------2-----------------------------2-----------
    ----65--------------------1-----------------------------1-----------
    ----66-----------------NULL-------------------------NULL-------

    Je cherche donc à avoir pour le profile 62 1 seul projet avec ses 2 items

    Merci d'avance

  2. #2
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Novembre 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2009
    Messages : 61
    Par défaut Reflexion
    Bon!!!, il suffit d'utiliser son cerveau et d'aller sur la doc msdn (transact sql) et de lire ça : COUNT ( { [ [ ALL | DISTINCT ] expression ] | * } )

    Rien de plus à dire......

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    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 : 22 002
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par dublow Voir le message
    Bon!!!, il suffit d'utiliser son cerveau et d'aller sur la doc msdn (transact sql) et de lire ça : COUNT ( { [ [ ALL | DISTINCT ] expression ] | * } )

    Rien de plus à dire......

    Si : que cela fait partie du langage SQL depuis plus de 30 ans !!!!!!!
    Il suffit donc de lire n'importe quel bon site web ou n'importe quel bon bouquin sur le sujet et d'apprendre le langage SQL....
    Mon site web, comme mon bouquin est fait pour ça !

    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/ * * * * *

  4. #4
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Novembre 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2009
    Messages : 61
    Par défaut
    Merci pour la critique, mais pour ce coup là j'ai pas vraiment reflechi.
    J'ai une question à propos de ma requête.
    J'ai interrogé 3 tables ou j'ai pu comptabiliser le nombre de projets et le nombre d'items.
    J'ai une table ("News") qui contient les informations sur les profiles, et une table newsType qui contient le type de news.

    la table NewsType contient les données suivantes
    NewsTypeId----------Name
    -----1-------------------Aime
    -----2-------------------Abonné
    -----3-------------------Publié


    Voici un exemple des données de la table news

    ItemsIdFK----------NewsTypeIdFK----------ProfileIdFK----------ProfileFollowerIdFK
    ----15------------------------1------------------------62------------------------NULL--------
    ----NULL---------------------2------------------------65-------------------------62----------

    Dans cette exemple, le profil 62 aime l'item 15 et le profil 62 est abonné au profil 65

    Je souhaite savoir combien de fois un profile a aimer qque chose ou combien de profil il suit....
    Faire la requete seule reste accessible mais la combiner avec la requete precedente me pose problème.

    Est ce que tu vois ce que je veux faire?
    Je cherche des pistes....

    Merci d'avance

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    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 : 22 002
    Billets dans le blog
    6
    Par défaut
    Vous pouvez encapsuler plusieurs COUNT, SUM, MAX, MIN, AVG différent portant sur des groupages différents en utilisant les fonctions de fenêtrage.
    Lisez l'article que j'ai écrit à ce sujet :
    http://sqlpro.developpez.com/article...clause-window/

    Quelque chose comme :
    SELECT COUNT(..) OVER(PARTITION BY ...),
    COUNT(..) OVER(PARTITION BY ...),
    ...

    Difficile devous aider plus sans le respect de la charte de postage qui vous demande de poster le DDL de vos tables et un jeu d'essais sous forme INSERT :
    http://www.developpez.net/forums/d96...vement-poster/

    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/ * * * * *

  6. #6
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Novembre 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2009
    Messages : 61
    Par défaut
    Merci pour votre réponse,

    J'ai réouvert votre livre (SQL 3eme edition, PEARSON). est ce que les sous requêtes corrélées (p.166) peuvent répondre à ma question?

    Je met le script nécessaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE [dbo].[NewsTypes](
    	[NewsTypeId] [smallint] IDENTITY(1,1) NOT NULL,
    	[Name] [varchar](50) NOT NULL,
     CONSTRAINT [PK_NewsTypeId] PRIMARY KEY NONCLUSTERED 
    (
    	[NewsTypeId] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    INSERT [dbo].[NewsTypes] ( [Name]) VALUES (N's''est abonné')
    INSERT [dbo].[NewsTypes] ( [Name]) VALUES (N'a publié')
    INSERT [dbo].[NewsTypes] ( [Name]) VALUES (N'a crée')
    INSERT [dbo].[NewsTypes] ( [Name]) VALUES (N'aime')
    INSERT [dbo].[NewsTypes] ( [Name]) VALUES (N'a commenté')
    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
    CREATE TABLE [dbo].[Profiles](
    	[ProfileId] [bigint] IDENTITY(1,1) NOT NULL,
    	[CountryIdFK] [smallint] NOT NULL,
    	[LastName] [varchar](50) NULL,
    	[FirstName] [varchar](50) NULL,
    	[Alias] [varchar](50) NULL,
    	[Sex] [smallint] NULL,
    	[Birthdate] [datetime] NULL,
    	[Password] [varchar](50) NOT NULL,
    	[Address] [varchar](255) NULL,
    	[PostalCode] [varchar](10) NULL,
    	[City] [varchar](50) NULL,
    	[State] [varchar](50) NULL,
    	[Email] [varchar](70) NOT NULL,
    	[PhonePrefix] [varchar](5) NULL,
    	[PhoneNumber] [varchar](20) NULL,
    	[NumberInvitations] [smallint] NULL,
    	[IsCreative] [bit] NULL,
    	[CreatedDate] [datetime] NOT NULL,
    	[Description] [varchar](255) NULL,
    	[LastConnection] [datetime] NULL,
    	[IsFullScreen] [bit] NULL,
    	[HasActivate] [bit] NULL,
    	[FacebookId] [nvarchar](100) NULL,
    	[TwitterId] [nvarchar](100) NULL,
    	[WebSiteAddress] [nvarchar](100) NULL,
    	[UrlProfile] [nvarchar](100) NULL,
    	[IsFavorite] [bit] NULL,
    	[IsMarked] [bit] NULL,
    	[IsSelected] [bit] NULL,
    	[UpdateDate] [datetime] NULL,
    	[ProjectIdFK] [int] NULL,
    	[LanguageIdFK] [int] NULL,
    	[WatermarkIdFK] [int] NULL,
    	[NumberSentInvitation] [smallint] NULL,
    	[AvatarIdFK] [bigint] NULL,
    	[BackgroundIdFK] [bigint] NULL,
     CONSTRAINT [PK_PROFILES] PRIMARY KEY NONCLUSTERED 
    (
    	[ProfileId] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    INSERT [dbo].[Profiles] ( [CountryIdFK], [LastName], [FirstName], [Alias], [Sex], [Birthdate], [Password], [Address], [PostalCode], [City], [State], [Email], [PhonePrefix], [PhoneNumber], [NumberInvitations], [IsCreative], [CreatedDate], [Description], [LastConnection], [IsFullScreen], [HasActivate], [FacebookId], [TwitterId], [WebSiteAddress], [UrlProfile], [IsFavorite], [IsMarked], [IsSelected], [UpdateDate], [ProjectIdFK], [LanguageIdFK], [WatermarkIdFK], [NumberSentInvitation], [AvatarIdFK], [BackgroundIdFK]) VALUES ( 1, N'name1', N'Nico', N'heyehy', 0, CAST(0x0000725A00000000 AS DateTime), N'mypassword', N'12, rue Pierre et Marie Curie', N'91000', N'city1', NULL, N'email@gmail.com', N'+33', N'649314938', 72, 1, CAST(0x00009F8B00000000 AS DateTime), N'toto et tata', CAST(0x00009E1E00000000 AS DateTime), 1, 1, N'vrevrfe', N'http://www.twitter.com/56437890', N'jnjknze', N'http://www.blabla.com/567832456890', 1, 1, 0, CAST(0x00009E0C00000000 AS DateTime), NULL, 39, NULL, NULL, 10, NULL)
    INSERT [dbo].[Profiles] ( [CountryIdFK], [LastName], [FirstName], [Alias], [Sex], [Birthdate], [Password], [Address], [PostalCode], [City], [State], [Email], [PhonePrefix], [PhoneNumber], [NumberInvitations], [IsCreative], [CreatedDate], [Description], [LastConnection], [IsFullScreen], [HasActivate], [FacebookId], [TwitterId], [WebSiteAddress], [UrlProfile], [IsFavorite], [IsMarked], [IsSelected], [UpdateDate], [ProjectIdFK], [LanguageIdFK], [WatermarkIdFK], [NumberSentInvitation], [AvatarIdFK], [BackgroundIdFK]) VALUES ( 1, N'name 2', N'toti', N'jiji', 0, CAST(0x0000725A00000000 AS DateTime), N'mypassword', N'frjkfrznf', N'69118', N'ville 4', NULL, N'nic@gmail.com', N'+33', N'646314938', 10, 1, CAST(0x00009E1E00000000 AS DateTime), N'Profil de Nicolas', CAST(0x00009E1E00000000 AS DateTime), 1, 1, N'evfgrvg', N'http://www.twitter.com/56437890', N'http://www.nicolas.fr', N'http://www.wheee.com/567832456890', 1, 0, 1, CAST(0x00009E0C00000000 AS DateTime), NULL, 39, NULL, NULL, 10, NULL)
    INSERT [dbo].[Profiles] ( [CountryIdFK], [LastName], [FirstName], [Alias], [Sex], [Birthdate], [Password], [Address], [PostalCode], [City], [State], [Email], [PhonePrefix], [PhoneNumber], [NumberInvitations], [IsCreative], [CreatedDate], [Description], [LastConnection], [IsFullScreen], [HasActivate], [FacebookId], [TwitterId], [WebSiteAddress], [UrlProfile], [IsFavorite], [IsMarked], [IsSelected], [UpdateDate], [ProjectIdFK], [LanguageIdFK], [WatermarkIdFK], [NumberSentInvitation], [AvatarIdFK], [BackgroundIdFK]) VALUES ( 1, N'AZERTY', N'Noo', N'pht', 0, CAST(0x0000725A00000000 AS DateTime), N'mypassword', N'25, rue Pierre et Maris Curie', N'69000', N'Lyon', NULL, N'dfr@gmail.com', N'+33', N'646314938', 10, 1, CAST(0x0000A0F900000000 AS DateTime), N'Profil de fifi', CAST(0x00009E1E00000000 AS DateTime), 1, 1, N'fgtr', N'http://www.twitter.com/56437890', N'http://www.nicolas.fr', N'http://www.hoho.com/567832456890', 0, 0, 0, CAST(0x00009E0C00000000 AS DateTime), NULL, 39, NULL, NULL, 10, NULL)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE TABLE [dbo].[News](
    	[NewsId] [bigint] IDENTITY(1,1) NOT NULL,
    	[NewsTypeIdFK] [smallint] NOT NULL,
    	[ItemsIdFK] [bigint] NULL,
    	[ProfileIdFK] [bigint] NULL,
    	[ProfileIdFollowerFK] [bigint] NULL,
    	[Date] [datetime] NOT NULL,
     CONSTRAINT [PK_NewsId] PRIMARY KEY NONCLUSTERED 
    (
    	[NewsId] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    INSERT [dbo].[News] ( [NewsTypeIdFK], [ItemsIdFK], [ProfileIdFK], [ProfileIdFollowerFK], [Date]) VALUES ( 4, NULL, 62, NULL, CAST(0x00009E1600000000 AS DateTime))
    INSERT [dbo].[News] ( [NewsTypeIdFK], [ItemsIdFK], [ProfileIdFK], [ProfileIdFollowerFK], [Date]) VALUES ( 1, NULL, 62, 65, CAST(0x00009E1600000000 AS DateTime))
    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
    CREATE TABLE [dbo].[Items](
    	[ItemsId] [bigint] IDENTITY(1,1) NOT NULL,
    	[ProjectIdFK] [bigint] NOT NULL,
    	[WatermarkIdFK] [int] NULL,
    	[ImageIdFK] [bigint] NULL,
    	[Name] [varchar](50) NOT NULL,
    	[IsPublishedOnProject] [bit] NOT NULL,
    	[UpdateDate] [datetime] NULL,
    	[PublishDate] [datetime] NULL,
    	[PortfolioIdFK] [bigint] NULL,
    	[NumberLiked] [int] NULL,
    	[NumberSeen] [int] NULL,
    	[NumberComments] [int] NULL,
    	[NumberShareFacebook] [int] NULL,
    	[NumberShareTwitter] [int] NULL,
    	[NumberShareMail] [int] NULL,
    	[IsFavorite] [bit] NULL,
    	[IsMarked] [bit] NULL,
    	[IsSelected] [bit] NULL,
     CONSTRAINT [PK_ItemsId] PRIMARY KEY NONCLUSTERED 
    (
    	[ItemsId] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    INSERT [dbo].[Items] ( [ProjectIdFK], [WatermarkIdFK], [ImageIdFK], [Name], [IsPublishedOnProject], [UpdateDate], [PublishDate], [PortfolioIdFK], [NumberLiked], [NumberSeen], [NumberComments], [NumberShareFacebook], [NumberShareTwitter], [NumberShareMail], [IsFavorite], [IsMarked], [IsSelected]) VALUES ( 15, NULL, 11, N'Artwork', 1, CAST(0x00009E0C00000000 AS DateTime), CAST(0x00009E0C00000000 AS DateTime), 7, 0, 0, 0, 0, 0, 0, 0, 1, 0)
    Les données de la table news ne seront pas bonne, il faudrait les changer par rapport au Id généré sur les autres tables.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 14/03/2014, 13h39
  2. compter nombre de lignes pendant une insertion
    Par nemo67 dans le forum Requêtes
    Réponses: 7
    Dernier message: 02/08/2009, 10h45
  3. compter nombre de ligne dans un gridview
    Par mapmip dans le forum ASP.NET
    Réponses: 4
    Dernier message: 07/07/2009, 11h04
  4. [XSLT] Compter nombre de ligne
    Par c+cool dans le forum XSL/XSLT/XPATH
    Réponses: 9
    Dernier message: 27/04/2006, 09h52
  5. Réponses: 6
    Dernier message: 21/04/2006, 11h22

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