2010-05-03 5 views

Répondre

2

Si vous ne se soucient pas des documents qui n'ont pas non plus de ces types, vous devriez obtenir de meilleures performances de cette façon:

SELECT testcharfield, 
    SUM(IF (Type = 'pi', quantity, 0)) AS OB, 
    SUM(IF (Type = 'pe', quantity, 0)) AS CB 
FROM Table1 
WHERE Type in ('pi', 'pe') 
    and sequenceID = 6107 
GROUP BY testcharfield 

Si vous ne les avez pas déjà, considérer les indices sur testcharfield et testcharfield. Je suppose que la cardinalité de la colonne Type ne ferait pas un bon candidat pour un index, mais considérez cela aussi.

0

Avez-vous essayé d'obtenir les totaux d'abord, puis créer les colonnes du tableau croisé:

Select Z.testcharfield 
    , Sum(Case When Z.Type = 'pi' Then Total End) As OB 
    , Sum(Case When Z.Type = 'pe' Then Total End) As CB 
From (
     Select testcharfield 
      , SUM(quantity) AS Total 
     From Table1 
     Where sequenceID = 6107 
      And Type In('pi','pe') 
     Group By testcharfield, Type 
     ) Z 
Group By Z.testcharfield 
+0

@ Thomas: J'aime cette idée, cela peut surpasser ma suggestion. – RedFilter

0
SELECT testcharfield, MAX(OB) AS OB, MAX(CB) AS CB FROM 
((SELECT testcharfield, SUM(quantity) AS OB, 0 AS CB 
FROM Table1 
WHERE Type = 'pi' AND sequenceID = 6107 
GROUP BY testcharfield) 
UNION 
(SELECT testcharfield, 0 AS OB, SUM(quantity) AS CB 
FROM Table1 
WHERE Type = 'pe' AND sequenceID = 6107 
GROUP BY testcharfield)) 

Vérifiez vos index sur testcharfield, sequenceID et Type.

Questions connexes