2017-08-02 3 views
0

je besoin d'aide pour construire une requête SQL ORACLE SQL (Oracle) qui peut me donner des ventes par Nom d'article pour chaque mois. Voici les colonnes qui sont nécessaires dans la requête - Date (mois), Nom du produit, la quantité Vendu, moyenne Prix unitaire, les ventes nettes, des unités de créditrequête pour les ventes par article

  • Quantité Vendu

    d'un élément est le net quantité vendue après les crédits pour un article particulier dans ce mois; qui est = SOMME (articles de facture Quantité vendue.) - SOMME (articles Note de crédit Quantité de crédit.)

  • Ventes nettes

    d'un élément dans un mois donné = SOMME (facture Items.Total Montant) - SUM (Articles Note de crédit Montant du crédit.)

  • unités de crédit : il se réfère à des unités totales de l'article (Quantité de crédit) qui ont été crédités en ce mois

Ci-dessous sont des tableaux :

Articles de facture (facture de date, numéro de facture, Product ID, Nom de l'article, la quantité vendue, Montant total)

Inventaire Réglage (date, entité, EntityID, ItemID, Nom de l'article, la quantité, Prix ​​unitaire, Stock en inventaire, Montant net) Ce tableau tient prix unitaire et la quantité d'un élément lorsque la facture ou une note de crédit pour cet article a été généré. L'entité peut être "Facture" ou "CreditNote". EntityID est Numéro de facture ou CreditNotes ID

Notes de crédit (extourne date, CreditNotes ID, ID client)

Articles Note de crédit (CreditNotes ID, ID d'objet, Nom de l'article, le crédit Quantité, crédit Montant) Remarque: il s'agit d'une table d'éléments de ligne pour la table Credit Notes. CreditNote Date disponible dans le tableau principal

Jusqu'à présent, j'ai cette requête, mais je ne suis pas en mesure de déterminer l'étape suivante de joindre des éléments de note de crédit et de crédit et d'obtenir des ventes nettes et des quantités vendues.

SELECT 
     inv_items."Invoice Date" inv_date, 
     inv_items."Product ID" inv_items_Prod_ID, 
     inv_items.Item Name, 
     AVG(IDR."Unit Price"), 
     SUM(inv_items."Quantity sold") total_Qty_Sold, 
     SUM(inv_items."Total Amount") inv_ItemsSale 
FROM "Invoice Items" inv_items 
JOIN "Inventory Adjustment" IDR ON IDR."EntityID" = inv_items."Invoice ID" 
    AND IDR."ItemID" = inv_items."Product ID" 
    AND IDR."Date" = inv_items."Invoice Date" 
GROUP BY 1, 
    2, 
    3 

Toute aide est très appréciée.

+0

Si vous utilisez Oracle, pourquoi voulez-vous une requête SQL ANSI? La requête que vous avez écrite n'est pas compatible avec ANSI. –

+0

Vous avez raison, je veux une requête en oracle. Mes excuses. Je vais modifier le post. – manshu116

+1

'groupe par 1, 2, 3' peut fonctionner dans d'autres produits de base de données (je pense que je l'ai lu), mais cela ne fonctionne pas dans Oracle. 'order by 1, 2, 3' fonctionne, mais pour le groupement, vous devez vous référer aux colonnes par nom et non par numéro. – mathguy

Répondre

0

J'ai préparé le script en fonction de vos exigences de question, mais en raison de moins d'informations dans votre question, telles que les types de données pour les colonnes et leur structure, je ne sais pas est ok:

SELECT 
     to_char (inv_items."Invoice Date", 'MONTH') inv_month, 
     inv_items."Product ID" inv_items_Prod_ID, 
     inv_items."Item Name" inv_items_name, 
     AVG(IDR."Unit Price") avg_unit_price, 
     SUM(inv_items."Quantity sold") total_Qty_Sold, 
     SUM(inv_items."Total Amount") inv_ItemsSale, 
     (SUM(inv_items."Quantity sold") - SUM(cni."credit Quantity")) Quantity_Sold, 
     (SUM(inv_items."Total Amount") - SUM(cni."Credit Amount")) Credit_units 
FROM "Invoice Items" inv_items 
JOIN "Inventory Adjustment" IDR 
    ON IDR."EntityID" = inv_items."Invoice ID" 
    AND IDR."ItemID" = inv_items."Product ID" 
    AND IDR."Date" = inv_items."Invoice Date" 
JOIN "Credit Notes" cn 
    ON IDR."EntityID" = cn."CreditNotes ID" 
    AND IDR."Entity" = 'CreditNote' --- filtering by only 'CreditNote' 
JOIN "Credit Note Items" cni 
    ON cn."CreditNotes ID" = cni."CreditNotes ID" 
GROUP BY to_char (inv_items."Invoice Date", 'MONTH'), inv_items."Product ID", inv_items."Item Name"; 

espère que cela vous aidera)

+0

en utilisant JOIN "Credit Notes" cn et JOIN "Credit Notes" cni ON cn. "CreditNotes ID" = cni. "CreditNotes ID" renvoie uniquement les crédits et non tous les éléments facturés. J'ai donc essayé avec LEFT JOIN. Cependant, les résultats ne semblent pas correspondre encore :( – manshu116

+0

Cause J'ai ajouté filtre (AND IDR. "Entity" = 'CreditNote' --- filtrage par seulement 'CreditNote'), essayez de supprimer et de relancer. S'il travaillera alors n'oubliez pas de "Voter" et "Set the Green" pour la réponse s'il vous plaît). – Ikrom

+0

Cela a fonctionné. J'ai REJOINT "Ajustement d'inventaire", LEFT JOIN "Notes de crédit" et également enlevé le filtre "Entity" = "CreditNote". – manshu116

0

À partir de votre requête et description, il semble que invoice_id, product_id et la date - sont uniques pour les éléments de la facture.

Alors vous devez faire la même chose pour la note de crédit - (. * Sélectionner cni, cn.CreditNote date à partir de Notes de crédit cn, Articles de notes de crédit où cni cni.CreditNotes ID = cn.CreditNotes ID) sous puis rejoindre cette sous-requête à idr par les mêmes 3 colonnes.

vous aussi meilleur groupe par IDR.itemname, IDR.itemid et IDR.date