Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Optimiser une requête de type trableau croisé

2 réponses
Avatar
Damien
Bonjour,
Sur SQL 2000, j'ai la requête suivante :

SELECT
agences.nom,
'S1'=count(DISTINCT CASE societes.nom WHEN 'S1' THEN cp_contrat END),
'S2'=count(DISTINCT CASE societes.nom WHEN 'S2' THEN cp_contrat END),
'S3'=count(DISTINCT CASE societes.nom WHEN 'S3' THEN cp_contrat END),
'S4'=count(DISTINCT CASE societes.nom WHEN 'S4' THEN cp_contrat END)
FROM factures
INNER JOIN mois_comptable ON
mois_comptable.cp_temps = factures.cp_mois_comptable
INNER JOIN groupe ON
factures.cle_agence = groupe.cp_societe And groupe.type = 'Agence'
INNER JOIN societes ON
groupe.code_societe = societes.code_societe
INNER JOIN agences ON
groupe.code_agence = agences.code_agence
WHERE
mois_comptable.AAAAMM Between '200303' And '200403'
GROUP BY
agences.nom

L'idée, c'est d'afficher le nombre de contrats par société et par agence du
groupe
sur une période donnée. C'est donc un tableau croisé (dynamique).

La requête met environ 60 s à l'execution

Les jointures sont très rapides et s'éxécute en 4 à 5 seconde maxi

ainsi :

SELECT
agences.nom,
count(cp_contrat)
FROM factures
INNER JOIN mois_comptable ON
mois_comptable.cp_temps = factures.cp_mois_comptable
INNER JOIN groupe ON
factures.cle_agence = groupe.cp_societe And groupe.type = 'Agence'
INNER JOIN societes ON
groupe.code_societe = societes.code_societe
INNER JOIN agences ON
groupe.code_agence = agences.code_agence
WHERE
mois_comptable.AAAAMM Between '200303' And '200403'
GROUP BY
agences.nom

prend 5 secondes

Les problèmes viennent semble-t-il des Count distinct sur les colonnes
pivot.

comment puis-je optimiser ça ?

Merci de votre aide

Damien

2 réponses

Avatar
Steve Kass
Damien,

Est-ce que cette requête donne le même résultat plus rapidement?

select
agences.nom,
count(case when nom = 'S1' then 1 end) S1,
count(case when nom = 'S2' then 1 end) S2,
count(case when nom = 'S3' then 1 end) S3,
count(case when nom = 'S4' then 1 end) S4
from (
select
agences.nom,
societes.nom,
cp_contrat
from <jointure>
where societes.nom in ('S1','S2','S3','S4')
group by agence.nom, societes.nom, cp_contrat
) t

Steve Kass
Drew University

"Damien" <dams_@[antispam]caramail.com> wrote in message
news:
Bonjour,
Sur SQL 2000, j'ai la requête suivante :

SELECT
agences.nom,
'S1'=count(DISTINCT CASE societes.nom WHEN 'S1' THEN cp_contrat END),
'S2'=count(DISTINCT CASE societes.nom WHEN 'S2' THEN cp_contrat END),
'S3'=count(DISTINCT CASE societes.nom WHEN 'S3' THEN cp_contrat END),
'S4'=count(DISTINCT CASE societes.nom WHEN 'S4' THEN cp_contrat END)
FROM factures
INNER JOIN mois_comptable ON
mois_comptable.cp_temps = factures.cp_mois_comptable
INNER JOIN groupe ON
factures.cle_agence = groupe.cp_societe And groupe.type = 'Agence'
INNER JOIN societes ON
groupe.code_societe = societes.code_societe
INNER JOIN agences ON
groupe.code_agence = agences.code_agence
WHERE
mois_comptable.AAAAMM Between '200303' And '200403'
GROUP BY
agences.nom

L'idée, c'est d'afficher le nombre de contrats par société et par agence


du
groupe
sur une période donnée. C'est donc un tableau croisé (dynamique).

La requête met environ 60 s à l'execution

Les jointures sont très rapides et s'éxécute en 4 à 5 seconde maxi

ainsi :

SELECT
agences.nom,
count(cp_contrat)
FROM factures
INNER JOIN mois_comptable ON
mois_comptable.cp_temps = factures.cp_mois_comptable
INNER JOIN groupe ON
factures.cle_agence = groupe.cp_societe And groupe.type = 'Agence'
INNER JOIN societes ON
groupe.code_societe = societes.code_societe
INNER JOIN agences ON
groupe.code_agence = agences.code_agence
WHERE
mois_comptable.AAAAMM Between '200303' And '200403'
GROUP BY
agences.nom

prend 5 secondes

Les problèmes viennent semble-t-il des Count distinct sur les colonnes
pivot.

comment puis-je optimiser ça ?

Merci de votre aide

Damien




Avatar
Damien
Bonjour Steve.

Magnifique !!

Le temps d'exécution est divisé par 5 ..ce qui nous fait environ 12
secondes... ce qui est très acceptable.
Petit oubli, il faut ajouter un Group By t.agences.nom à la fin de la
requête.

Merci beaucoup

Damien

"Steve Kass" a écrit dans le message de news:

Damien,

Est-ce que cette requête donne le même résultat plus rapidement?

select
agences.nom,
count(case when nom = 'S1' then 1 end) S1,
count(case when nom = 'S2' then 1 end) S2,
count(case when nom = 'S3' then 1 end) S3,
count(case when nom = 'S4' then 1 end) S4
from (
select
agences.nom,
societes.nom,
cp_contrat
from <jointure>
where societes.nom in ('S1','S2','S3','S4')
group by agence.nom, societes.nom, cp_contrat
) t

Steve Kass
Drew University

"Damien" <dams_@[antispam]caramail.com> wrote in message
news:
> Bonjour,
> Sur SQL 2000, j'ai la requête suivante :
>
> SELECT
> agences.nom,
> 'S1'=count(DISTINCT CASE societes.nom WHEN 'S1' THEN cp_contrat END),
> 'S2'=count(DISTINCT CASE societes.nom WHEN 'S2' THEN cp_contrat END),
> 'S3'=count(DISTINCT CASE societes.nom WHEN 'S3' THEN cp_contrat END),
> 'S4'=count(DISTINCT CASE societes.nom WHEN 'S4' THEN cp_contrat END)
> FROM factures
> INNER JOIN mois_comptable ON
> mois_comptable.cp_temps = factures.cp_mois_comptable
> INNER JOIN groupe ON
> factures.cle_agence = groupe.cp_societe And groupe.type = 'Agence'
> INNER JOIN societes ON
> groupe.code_societe = societes.code_societe
> INNER JOIN agences ON
> groupe.code_agence = agences.code_agence
> WHERE
> mois_comptable.AAAAMM Between '200303' And '200403'
> GROUP BY
> agences.nom
>
> L'idée, c'est d'afficher le nombre de contrats par société et par agence
du
> groupe
> sur une période donnée. C'est donc un tableau croisé (dynamique).
>
> La requête met environ 60 s à l'execution
>
> Les jointures sont très rapides et s'éxécute en 4 à 5 seconde maxi
>
> ainsi :
>
> SELECT
> agences.nom,
> count(cp_contrat)
> FROM factures
> INNER JOIN mois_comptable ON
> mois_comptable.cp_temps = factures.cp_mois_comptable
> INNER JOIN groupe ON
> factures.cle_agence = groupe.cp_societe And groupe.type = 'Agence'
> INNER JOIN societes ON
> groupe.code_societe = societes.code_societe
> INNER JOIN agences ON
> groupe.code_agence = agences.code_agence
> WHERE
> mois_comptable.AAAAMM Between '200303' And '200403'
> GROUP BY
> agences.nom
>
> prend 5 secondes
>
> Les problèmes viennent semble-t-il des Count distinct sur les colonnes
> pivot.
>
> comment puis-je optimiser ça ?
>
> Merci de votre aide
>
> Damien
>
>