2013-10-11 4 views
0

Vous ne savez pas si le titre a du sens, mais je vais essayer. Fondamentalement, j'ai un rapport où je jette un tas de données dans une table temporaire, puis l'affiche sur une page Web. Les totaux pour ce rapport doivent être une moyenne pondérée, mais certaines données dans le tableau rejettent cette moyenne.Valeurs de somme basées sur des valeurs de colonne individuelles

Voici un exemple de l'ensemble de données dans la table temporaire

CustomerNo CountryCode qJAN rJAN gJAN qFEB rFEB gFEB 
IDS1  ID   1500 0  0  1500 0  0  
ID18J  ID   8000 15  120000 8000 15  120000  
ID21  ID   3000 0  0  0  0  0  
ID22J  ID   9000 0  0  12000 0  0  
ID22S  ID   9500 0  0  0  0  0  
ID22S  ID   9500 0  0  0  0  0  
ID31S  ID   3000 0  0  0  0  0  

Où qCOL est la quantité, RCOL est le taux et GCOL est brut (quantité taux *).

Les valeurs ne doivent maintenant être comptabilisées que dans le total du pays s'il y a une quantité et un taux. La requête que j'utilise est la suivante:

SELECT CASE SUM(qJAN) WHEN 0 THEN 0 ELSE SUM(gJAN)/SUM(qJAN) END AS JAN, 
     CASE SUM(qFEB) WHEN 0 THEN 0 ELSE SUM(gFEB)/SUM(qFEB) END AS FEB, 
     ... 
     CASE(SUM(qJAN) + SUM(qFEB) + ...) 
     WHEN 0 THEN 0 
     ELSE 
     (SUM(gJAN) + SUM(gFEB) + ...)/(SUM(qJAN) + SUM(qFEB) + ...) END AS TOT 
FROM table 
WHERE CountryCode = N'ID' 

La requête ci-dessus renvoie les moyennes pondérées suivantes pour janvier et février, respectivement: 3,24 et 4,90 tous deux ont tort. Le résultat correct serait 15.00 pour les deux.

Le problème est que ce qui précède prend en compte les quantités qui n'ont pas de taux.

Je peux contourner ce problème en utilisant les sous-requêtes, mais ce que je suis venu avec commencé à sortir de contrôle et va vraiment enliser les choses:

SELECT CASE 
(SELECT SUM(qJAN) FROM table WHERE CountryCode = N'ID' AND rJAN <> 0) 
WHEN 0 THEN 0 ELSE 
SUM(gJAN)/
(SELECT SUM(qJAN) FROM table WHERE CountryCode = N'ID' AND rJAN <> 0) 
END AS JAN, 
CASE 
(SELECT SUM(qFEB) FROM table WHERE CountryCode = N'ID' AND rFEB <> 0) 
WHEN 0 THEN 0 ELSE 
SUM(gFEB)/
(SELECT SUM(qFEB) FROM table WHERE CountryCode = N'ID' AND rFEB <> 0) 
END AS FEB, 
... 
CASE 
(
(SELECT SUM(qJAN) FROM table WHERE CountryCode = N'ID' AND rJAN <> 0) + 
(SELECT SUM(qFEB) FROM table WHERE CountryCode = N'ID' AND rFEB <> 0) + 
... 
) 
WHEN 0 THEN 0 ELSE 
(SUM(gJAN) + SUM(gFEB) + ...)/
(
(SELECT SUM(qJAN) FROM table WHERE CountryCode = N'ID' AND rJAN <> 0) + 
(SELECT SUM(qFEB) FROM table WHERE CountryCode = N'ID' AND rFEB <> 0) + ... 
) END AS TOT 

Cela renvoie les totaux corrects, mais comme vous pouvez le voir se laid vite. Toutes ces sous-requêtes vont tuer la performance.

Existe-t-il un moyen plus simple d'obtenir le résultat que je recherche? Je me sens comme il doit y avoir mais je suis complètement bloquant le cerveau sur ceci.

Merci.

Répondre

Questions connexes