2013-04-12 2 views
-2

Compte tenu du tableau suivantSQL - Soustraire la somme de certains documents du total

ITEMID | TYPE   | QTY | 
----------------------- 
... 
134  |TOTALINDEPOT | 169 | 
134  |UNUSED   | 70 | 
134  |FAULTY   | 15 | 
134  |DAMAGED  | 1 | 
134  |DELAYED  | 100 | 
... 

Quel est un moyen efficace de récupérer la quantité d'articles disponibles avec id 134 (à l'exception de ceux-ci retardée)? Le résultat est 83 => (169- (70 + 15 + 1)). Je l'ai mis en œuvre avec (SELECT qty FROM tableA WHERE type='TOTALINDEPOT' AND itemid='134') - (SELECT SUM(qty) ... WHERE TYPE IN ('UNUSED', 'FAULTY', 'DAMAGED')) AND itemid='134', mais en cherchant quelque chose de plus élégant.

+3

Votre question est difficile à comprendre. Pourriez-vous poster ce que vous aimeriez voir comme résultat? – swasheck

+0

Pouvez-vous poster le schéma de la table? Et un ensemble de résultats possible. Maintenant, ce serait élégant :). – Marian

+0

Informations supplémentaires à la question – user1296490

Répondre

2

Comme ça?

SELECT a.ITEMID, 
    (SELECT SUM(QTY) FROM tbl WHERE TYPE = 'TOTAL' AND ITEMID = a.ITEMID) - 
    (SELECT SUM(QTY) FROM tbl WHERE TYPE <> 'TOTAL' AND ITEMID = a.ITEMID) AS available 
FROM tbl a 
GROUP BY a.ITEMID 

Résultat

| ITEMID | AVAILABLE | 
---------------------- 
| 134 |  83 |

See the demo

0

aura-t-il pour vous?

SELECT a.total1 - a.total2 
FROM 
(
    SELECT SUM(CASE WHEN type='total' THEN qty ELSE 0 END) as total1, 
    SUM(CASE WHEN type<>'total' THEN qty ELSE 0 END) as total2 
    FROM table WHERE itemid = 134 
)a 
0

Une autre façon:

SELECT SUM(QTY) - 
     SUM(CASE WHEN [TYPE] IN ('UNUSED', 'FAULTY', 'DAMAGED') THEN QTY END) AS TotalSum 
FROM TABLE1 

DEMO: