2017-10-18 7 views
1

je tente d'exécuter la requête:requêtes SQL - GROUP BY SUM se bloque où aucun élément

SELECT statement_element_statement_id, sum(statement_element_commission_amount_change) 
    FROM [chester-prod].[dbo].[ws_statement_element_commissions] 
    JOIN [chester-prod].[dbo].[ws_statement_elements] 
    on [statelemt_element_commission_se_id] = statement_element_id 
    WHERE statement_element_statement_id in 
    (10258, 10226, 10225, 10224, 10223, 
    10220, 10219, 10218, 10217, 10216) 
    GROUP BY statement_element_statement_id 

10258, 10226, 10225, 10224, 10223 - ces ids a des éléments

10220, 10219, 10218 , 10217, 10216 - il n'y a aucun élément ids

Quand je lance cette requête, je peux obtenir 5 résultats:

SELECT statement_element_statement_id, sum(statement_element_commission_amount_change) 
    FROM [chester-prod].[dbo].[ws_statement_element_commissions] 
    JOIN [chester-prod].[dbo].[ws_statement_elements] 
    on [statelemt_element_commission_se_id] = statement_element_id 
    WHERE statement_element_statement_id in 
    (10258, 10226, 10225, 10224, 10223) 
    GROUP BY statement_element_statement_id 

enter image description here

Comment gérer la suspension lorsque group by peut parfois ne pas trouver d'éléments pour un identifiant particulier dans l'instruction where?

+2

Que voulez-vous dire par "poignée suspendue"? – GurV

+0

Vous souhaitez avoir ces numéros 10220, ... (sans élément) dans le résultat? –

+0

Je prévois 5 lignes avec des résultats numériques, 5 lignes sans résultat ou même ne pas apparaître. Ma requête se bloque quand au moins un des 5 éléments (10220, 10219, 10218, 10217, 10216) apparaît. EDIT: écran ajouté avec seulement 5 éléments dans la requête où tous ont les enregistrements – Staly

Répondre

1

Utilisez un droit de jointure (ou inverse l'ordre et utiliser une jointure gauche):

SELECT 
    statement_element_statement_id, 
    sum(statement_element_commission_amount_change) 
FROM 
    [chester-prod].[dbo].[ws_statement_element_commissions] 
    RIGHT JOIN [chester-prod].[dbo].[ws_statement_elements] on 
     [statelemt_element_commission_se_id] = statement_element_id 
WHERE 
    statement_element_statement_id in (
     10258, 10226, 10225, 10224, 10223, 
     10220, 10219, 10218, 10217, 10216 
    ) 
GROUP BY 
    statement_element_statement_id 
+1

nvl est coalesce dans MSSQL, n'a pas aidé – Staly

+0

instruction_element_commission_amount_change est dans la table ws_statement_element_commissions, vous n'avez pas besoin de nvl ou coalesce – Indent

+0

'coalesce' ou' isnull' sont requis si vous voulez une valeur par défaut – Indent

0

Vous pouvez essayer. Je pense que la table [ws_statement_elements] devrait être sur le côté gauche.

SELECT statement_element_statement_id, SUM(ISNULL(statement_element_commission_amount_change,0)) 
    FROM [chester-prod].[dbo].[ws_statement_elements] 
     LEFT JOIN [chester-prod].[dbo].[ws_statement_element_commissions] 
    on [statelemt_element_commission_se_id] = statement_element_id 
    WHERE statement_element_statement_id in 
    (10258, 10226, 10225, 10224, 10223, 
    10220, 10219, 10218, 10217, 10216) 
    GROUP BY statement_element_statement_id 
+0

Cela prend 50 secondes pour faire complète demande. – Staly

+0

Comment le résultat avant? –

+0

C'était entre 50-60 secondes. – Staly