8
votes

Calcul de la somme de (Quantité * Prix) de 2 tables différentes

J'ai deux tables comme suit

Produit code> Table p>

Id         OrderId        ProductId        Quantity
151        883            1                22
152        883            4                11
153        883            5                8
154        883            6                62


7 commentaires

Voulez-vous deux colonnes - sous-total par produit et total par commande? Votre requête n'a qu'une colonne ...


Il est préférable de demander des conseils sur les requêtes SQL d'inclure une petite quantité de données d'échantillonnage (même si seulement 3 ou 4 rangées) et le résultat attendu de la requête.


Salut Tom - avez maintenant ajouté des échantillons de données.


Thx pour l'exemple de données, mais qu'attendez-vous pour la sortie?


Juste un total total pour la commande, donc je veux juste retourner 1 valeur - la somme de la quantité Price pour chaque commande, filtrée par la commande. En termes simples, je veux une somme (quantité prix) où ORDORID = 883


Consultez ma mise à jour, mais sans exemple, tout ce que nous avions, c'est votre requête d'origine utilisée commanderItem.id plutôt que ordreItem.orderid .


Cela a fonctionné comme un charme! Merci un tas !!


5 Réponses :


20
votes

Utilisation:

  SELECT oi.orderid,
         SUM(oi.quantity * p.price) AS grand_total,
    FROM ORDERITEM oi
    JOIN PRODUCT p ON p.id = oi.productid
   WHERE oi.orderid = @OrderId
GROUP BY oi.orderid


2 commentaires

+1 Cependant, je pense que la déclaration "si oi.quantitity ou p.price est NULL alors la somme retournera NULL" est un peu difficile. La somme ne renverra que NULL si la valeur pour toutes les lignes d'un groupe est NULL. Sinon la somme ignore null. Donc, la quantité ou le prix devraient être nuls pour chaque ligne d'un groupe pour que ce groupe soit nul.


Hey @OMG Poneies, votre requête retourne un sous-total pour chaque ligne de commande, plutôt que le total total pour toutes les lignes. Presque comme la somme est ignorée: /



0
votes
select orderID, sum(subtotal) as order_total from
(
    select orderID, productID, price, qty, price * qty as subtotal
    from product p inner join orderitem o on p.id = o.productID
    where o.orderID = @orderID
) t
group by orderID

4 commentaires

Salut @Beth - Je reçois une "syntaxe incorrecte près du mot clé" Group "."


Désolé, devait ajouter un alias après le)


Cela renvoie toutes les lignes de la table de commande, et la commande_total et le sous-total sont identiques, alors la somme à nouveau ne fait pas son travail: /


Désolé encore, je ne savais pas que vous ne vouliez que le total du total et que je devais supprimer des colonnes de la requête interne, vous ne voulez pas tomber en panne.



1
votes

Je pense que cela - y compris la valeur null = 0 xxx


3 commentaires

NVL Est-ce que Oracle spécifique - Coallece serait un meilleur choix.


Il n'y a aucune raison de faire de la coalée (ou de la NVL) sur chaque entrée. Vous pourriez: regroupement (somme (OI.Quantity * p.Price), 0) comme total_qty .


Cela ne renvoie pas le total du total, mais plutôt le sous-total de chaque ligne de commande, identique à la réponse de @OMG Ponies ci-dessus.



1
votes

Je pense que c'est le long des lignes de ce que vous recherchez. Il semble que vous souhaitiez voir la commandeID, le sous-total de chaque élément de l'ordre et le montant total de la commande.

select o1.orderID, o1.subtotal, sum(o2.UnitPrice * o2.Quantity) as order_total from
(
    select o.orderID, o.price * o.qty as subtotal
    from product p inner join orderitem o on p.ProductID= o.productID
    where o.orderID = @OrderId
)as o1
inner join orderitem o2 on o1.OrderID = o2.OrderID
group by o1.orderID, o1.subtotal


1 commentaires

Hey @mpminnich, j'ai juste besoin du total total pour tous les ordonnances, donc fondamentalement la somme de la quantité * Price



0
votes

J'ai eu le même problème que Marko et rencontré une solution comme celle-ci: xxx pré>

et utilisez simplement la procédure stockée GetGrandTotal pour récupérer le total du total :) P>

EXEC GetGrandTotal


0 commentaires