2017-08-25 2 views
1

J'ai le code suivant qui présente les résultats dans un tableau avec plusieurs colonnes.SQL Server: somme de plusieurs sélections

SELECT 
    ref, design, 
    ISNULL((SELECT Sum(qtt) FROM bi(nolock) WHERE bi.ndos = 34 AND bofref like #1# AND bi.ref = temp.ref GROUP BY ref), 0) AS 'LPP', 
    ISNULL((SELECT Sum(qtt) FROM bi(nolock) WHERE bi.ndos = 28 AND bofref like #1# AND bi.ref = temp.ref GROUP BY ref), 0) AS 'LPM', 
    ISNULL((SELECT Sum(qtt) FROM bi(nolock) WHERE bi.ndos = 42 AND bofref like #1# AND bi.ref = temp.ref GROUP BY ref), 0) AS 'RNPM', 
    ISNULL((SELECT Sum(qtt) FROM bi(nolock) WHERE bi.ndos = 68 AND bofref like #1# AND bi.ref = temp.ref GROUP BY ref), 0) AS 'RAM', 
    ISNULL((SELECT Sum(qtt2) FROM bi(nolock) WHERE bi.ndos = 68 AND bofref like #1# AND bi.ref = temp.ref GROUP BY ref), 0) AS 'RA' , 
    ISNULL((SELECT Sum(qtt) FROM bi(nolock) WHERE bi.ndos = 59 AND bofref like #1# AND bi.ref = temp.ref GROUP BY ref), 0) AS 'GD' 
FROM 
    bi(nolock) temp 
WHERE 
    (temp.ndos = 34 OR temp.ndos = 28 OR temp.ndos = 42 OR temp.ndos = 68) 
    AND temp.bofref LIKE #1# 
    AND temp.ref NOT LIKE ' ' 
GROUP BY 
    ref, design 
ORDER BY 
    ref 

Je veux maintenant résumer les valeurs de certains select dans une nouvelle colonne, par exemple, je voulais résumer dans une colonne totale des colonnes « PPPL, RNPM et RA », mais je ne suis pas en mesure de le faire fonctionner.

Comment cela peut-il être fait?

+0

Supprimez les sous-requêtes et utilisez plutôt cas. Avoir comme dans où clause est comme tuer votre requête pour aucune raison. – Prathyush

+0

Je ne connais pas d'autre moyen de le faire. # 1 # est une variable qui est écrite par l'utilisateur et peut être dans plusieurs formats comme xx.xxxx.xx ou xx.xxxx ou xx. et le code doit rechercher tous les résultats qui correspondent à la variable. – NelsonPaiva

Répondre

0

si je vous comprends bien résumer le pourrait colonnes simples

SELECT 
      ref 
     , design 
    Isnull((SELECT Sum(qtt) FROM bi(nolock) WHERE bi.ndos = 34 AND bofref like #1# AND bi.ref = temp.ref GROUP BY ref), 0) AS 'LPP', 
    Isnull((SELECT Sum(qtt) FROM bi(nolock) WHERE bi.ndos = 28 AND bofref like #1# AND bi.ref = temp.ref GROUP BY ref), 0) AS 'LPM', 
    Isnull((SELECT Sum(qtt) FROM bi(nolock) WHERE bi.ndos = 42 AND bofref like #1# AND bi.ref = temp.ref GROUP BY ref), 0) AS 'RNPM', 
    Isnull((SELECT Sum(qtt) FROM bi(nolock) WHERE bi.ndos = 68 AND bofref like #1# AND bi.ref = temp.ref GROUP BY ref), 0) AS 'RAM', 
    Isnull((SELECT Sum(qtt2) FROM bi(nolock) WHERE bi.ndos = 68 AND bofref like #1# AND bi.ref = temp.ref GROUP BY ref), 0) AS 'RA' , 
    Isnull((SELECT Sum(qtt) FROM bi(nolock) WHERE bi.ndos = 59 AND bofref like #1# AND bi.ref = temp.ref GROUP BY ref), 0) AS 'GD', 
    Isnull((SELECT Sum(qtt) FROM bi(nolock) WHERE bi.ndos = 34 AND bofref like #1# AND bi.ref = temp.ref GROUP BY ref), 0) + 
    Isnull((SELECT Sum(qtt) FROM bi(nolock) WHERE bi.ndos = 28 AND bofref like #1# AND bi.ref = temp.ref GROUP BY ref), 0) + 
    Isnull((SELECT Sum(qtt) FROM bi(nolock) WHERE bi.ndos = 42 AND bofref like #1# AND bi.ref = temp.ref GROUP BY ref), 0) + 
    Isnull((SELECT Sum(qtt) FROM bi(nolock) WHERE bi.ndos = 68 AND bofref like #1# AND bi.ref = temp.ref GROUP BY ref), 0) as TOTAL_COLUMN 

    FROM bi(nolock) temp 
    WHERE (temp.ndos = 34 
     OR temp.ndos = 28 
     OR temp.ndos = 42 
     OR temp.ndos = 68) 
    AND temp.bofref like #1# 
    AND temp.ref NOT LIKE ' ' 
    GROUP BY ref, 
     design 
    ORDER BY ref 
+0

Cela fonctionne merci. – NelsonPaiva

0

La façon la plus simple consiste à envelopper votre requête dans un autre:

SELECT sub.*, 
     LPP + RNPM + RA as LPP_RNPM_RA 
FROM (  
    SELECT ref, design, 
     Isnull((SELECT Sum(qtt) FROM bi(nolock) WHERE bi.ndos = 34 AND bofref like #1# AND bi.ref = temp.ref GROUP BY ref), 0) AS 'LPP', 
     Isnull((SELECT Sum(qtt) FROM bi(nolock) WHERE bi.ndos = 28 AND bofref like #1# AND bi.ref = temp.ref GROUP BY ref), 0) AS 'LPM', 
     Isnull((SELECT Sum(qtt) FROM bi(nolock) WHERE bi.ndos = 42 AND bofref like #1# AND bi.ref = temp.ref GROUP BY ref), 0) AS 'RNPM', 
     Isnull((SELECT Sum(qtt) FROM bi(nolock) WHERE bi.ndos = 68 AND bofref like #1# AND bi.ref = temp.ref GROUP BY ref), 0) AS 'RAM', 
     Isnull((SELECT Sum(qtt2) FROM bi(nolock) WHERE bi.ndos = 68 AND bofref like #1# AND bi.ref = temp.ref GROUP BY ref), 0) AS 'RA' , 
     Isnull((SELECT Sum(qtt) FROM bi(nolock) WHERE bi.ndos = 59 AND bofref like #1# AND bi.ref = temp.ref GROUP BY ref), 0) AS 'GD' 
    FROM bi(nolock) temp 
    WHERE temp.ndos IN (34, 28, 42, 68) 
     AND temp.bofref like #1# 
     AND temp.ref NOT LIKE ' ' 
    GROUP BY ref, 
      design 
    ) as sub 
ORDER BY ref 

Notez que vous pouvez utiliser l'opérateur IN au lieu des OR combinaisons que vous avez dans votre article where.

De plus, la façon dont vous somme semble maladroite: ne pas faire les sous-requêtes, mais le faire dans votre select:

 Sum(CASE WHEN temp.ndos = 34 THEN qtt ELSE 0 END) AS 'LPP', 

... etc.

+0

J'essaie cela mais sans résultat. Il n'y a pas d'erreur mais il n'y a pas de résultats aussi. Je vais essayer de voir si je peux trouver ce qui ne va pas. Merci – NelsonPaiva