Partage
  • Partager sur Facebook
  • Partager sur Twitter

Sommer deux COUNT(DISTINCT...

    18 septembre 2020 à 15:32:53

    Bonjour, 

    je souhaite sommer mes deux champs (tempTotal.NBCPTACT2 + tempTotal.NBCPTDISP2) mais il me semble que le SUM ne se traite pas avec le DISTINCT.... Ma problématique : dans ces deux champs des AccountID sont en communs et je souhaite qu'ils ne soient comptés qu'une seule fois, voici ma requête :

    SELECT
    	P.Login,
    	SUM(tempTotal.NBCPTACT2 + tempTotal.NBCPTDISP2)
    FROM
    	Person P
    		INNER JOIN (
    				SELECT
    					Person.Login,
    					COUNT (DISTINCT tempACT.NBCPTACT) AS 'NBCPTACT2',
    					COUNT (DISTINCT tempDISP.NBCPTDISP) AS 'NBCPTDISP2'
    				FROM
    					Person
    						INNER JOIN (
    								SELECT DISTINCT
    									Action.AccountID AS 'NBCPTACT',
    									Action.CreatedBy
    								FROM Action
    								WHERE
    									Action.ActionTypeCode NOT IN  ('COR','COU','EXPN1','GRDCPT','INTREPREL','P2INFN1','P2INFN2','P2SUPN1','P2SUPN2','P2SUPN3','P3N1','PCTXINFN1','PCTXINFN2','PCTXINFN3','PCTXINFN4','PCTXINFN5','PCTXN1','PCTXN2','PCTXN3','PCTXN4','PCTXSUPN1','PCTXSUPN2','PCTXSUPN3','PCTXSUPN4','PCTXSUPN5','PRINF5N1','PRINF5N2','PRINF5N3','PRSUP5N1','PRSUP5N2','PRSUP5N3','PRSUP5N4','PRSUP5N5','PRSUP5N6','PUN1','PUN2','PUN3','PUN4','PUN5','RELAPP','RELCAMP','SUP10K','TOG')
    									AND (
    										CONVERT( date, Action.CreationDate ) >= CONVERT( date, '2020-09-01' )
    										AND CONVERT( date, Action.CreationDate ) <= CONVERT(date,'2020-09-17' )
    									)
    								GROUP BY Action.CreatedBy, Action.AccountID
    							) tempACT
    							ON tempACT.CreatedBy = Person.Login
    						LEFT OUTER JOIN (
    								SELECT DISTINCT
    									DisputeFolder.AccountID AS 'NBCPTDISP',
    									DisputeFolder.CreatedBy
    								FROM DisputeFolder
    								WHERE (
    									CONVERT( date, DisputeFolder.CreationDate ) >= CONVERT( date, '2020-09-01' )
    									AND CONVERT( date,DisputeFolder.CreationDate ) <= CONVERT( date,'2020-09-17' )
    								)
    								GROUP BY
    									DisputeFolder.CreatedBy,
    									DisputeFolder.AccountID
    							) tempDISP
    							ON tempDISP.CreatedBy = Person.Login
    				GROUP BY Person.Login
    			) tempTotal
    			ON tempTotal.Login = person.login
    GROUP BY Person.Login

    Merci par avance pour votre aide 

    -
    Edité par Benzouye 18 septembre 2020 à 15:52:20

    • Partager sur Facebook
    • Partager sur Twitter
      18 septembre 2020 à 17:55:02

      Bonjour,

      La requête me paraît extrêmement compliquée pour rien et comporte certains problèmes de syntaxe ...

      Si je comprends bien, une personne peut créer plusieurs actions et plusieurs disputes, auprès de comptes, et tu cherches à compter le nombre de comptes distincts par créateur d'action et par créateur de dispute ?

      Dans une requête, SELECT DISTINCT et GROUP BY sont bien souvent incompatibles, et vu que tu utilises vraisemblablement MySQL tu n'as pas eu d'erreur affichée ...

      SELECT
      	P.Login,
      	COALESCE( A.NBCPTACT, 0 ) AS NBCPTACT,
      	COALESCE( D.NBCPTDISP, 0 ) AS NBCPTDISP,
      	COALESCE( A.NBCPTACT, 0 ) + COALESCE( D.NBCPTDISP, 0 ) AS TOTAL
      FROM
      	Person P
      	
      		LEFT JOIN (
      				-- Nombre de comptes sur actions par créateur
      				SELECT
      					CreatedBy AS Login,
      					COUNT( DISTINCT AccountID ) AS NBCPTACT
      				FROM Action
      				WHERE
      					ActionTypeCode NOT IN ('COR','COU','EXPN1','GRDCPT','INTREPREL','P2INFN1','P2INFN2','P2SUPN1','P2SUPN2','P2SUPN3','P3N1','PCTXINFN1','PCTXINFN2','PCTXINFN3','PCTXINFN4','PCTXINFN5','PCTXN1','PCTXN2','PCTXN3','PCTXN4','PCTXSUPN1','PCTXSUPN2','PCTXSUPN3','PCTXSUPN4','PCTXSUPN5','PRINF5N1','PRINF5N2','PRINF5N3','PRSUP5N1','PRSUP5N2','PRSUP5N3','PRSUP5N4','PRSUP5N5','PRSUP5N6','PUN1','PUN2','PUN3','PUN4','PUN5','RELAPP','RELCAMP','SUP10K','TOG')
      					AND CreationDate >= '2020-09-01'
      					AND CreationDate <= '2020-09-17'
      				GROUP BY CreatedBy
      			) A
      			ON P.Login = A.Login
      
      		LEFT JOIN (
      				-- Nombre de comptes sur dispute par créateur
      				SELECT
      					CreatedBy AS Login,
      					COUNT( DISTINCT AccountID ) AS NBCPTDISP
      				FROM DisputeFolder
      				WHERE
      					CreationDate >= '2020-09-01'
      					AND CreationDate <= '2020-09-17'
      				GROUP BY CreatedBy
      			) D
      			ON P.Login = D.Login
      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL

      Sommer deux COUNT(DISTINCT...

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown