2017-08-02 97 views
0

我需要帮助来构建一个ORACLE SQL查询,该查询可以为每个月给出按物料名称销售额。 下面是需要在查询中的列 - 日期(月),产品名称,数量销售,平均单价,净销售额,信用单位按项目的SQL(Oracle)销售查询

  • 售出数量

    项目的

    是网在该月的特定项目的信用额度之后销售的数量;这是 = SUM(发票项目销售数量。) - SUM(信用票据项目的信贷数量。)

  • 净销售额

    项目的特定月份

    = SUM(发票金额Items.Total) - SUM(信用票据项目的信贷量。)

  • 信用单位 :它指的是那些在当月

下面是桌子被记项(贷款量)的总台:

发票项目(发票日期,发票编号,产品编号,产品名称,销售数量,总金额)

库存调整(日期,实体,ENTITYID,项ID,产品名称,数量,单价,现有库存,净额) 该表包含生成该项目的发票或贷项通知时项目的单价和数量。实体可以是'发票'或'CreditNote'。 ENTITYID是发票ID或CreditNotes ID

信用票据(CreditNote日期,CreditNotes ID,客户ID)

信用票据项目(CreditNotes ID,商品编号,商品名称,信贷数量,信用证金额) 注意:这是Credit Notes表的行项目表。 CreditNote日期在主表中可用

到目前为止,我有这个查询,但我无法找出加入信用票据和信用票据项目并获得销售净额和数量的下一步骤。

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 

任何帮助,非常感谢。

+0

如果您使用的是Oracle,你为什么要一个ANSI SQL查询?您编写的查询不是ANSI兼容的。 –

+0

你说得对,我想在oracle中查询。我很抱歉。我将编辑帖子。 – manshu116

+1

'group by 1,2,3''可以在其他数据库产品中工作(我想我读过它),但它在Oracle中不起作用。 '1,2,3的顺序'起作用,但对于分组,您必须按名称而不是数字来引用列。 – mathguy

回答

0

我根据你的问题需求准备了脚本,但是由于你的问题中的信息较少,例如列和它们的结构的数据类型,我不确定,你可以试着让我知道代码是确定的:

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"; 

希望它会帮助你)

+0

使用JOIN“Credit Notes”cn和JOIN“Credit Note Items”cni ON cn。“CreditNotes ID”= cni。“CreditNotes ID”仅返回信用项目而不是所有发票项目。所以我尝试了LEFT JOIN。但是,结果似乎仍不匹配:( – manshu116

+0

原因我添加了过滤器(AND IDR。“Entity”='CreditNote'---仅通过'CreditNote'过滤),请尝试删除并再次运行 如果它将工作,然后不要忘记“请投票”和“设置绿色”的标志为答案)。 – Ikrom

+0

它工作。我加入“库存调整”,左加入“信用票据”,并删除过滤器“实体”=“CreditNote”。 – manshu116

0

在您的查询和说明中,似乎invoice_id,product_id和日期 - 对于发票项目是唯一的。

所以你需要做相同的信用票据 - (选择cni。*,cn.CreditNote日期从贷方票据cn,贷方票据项目cni其中cni.CreditNotes ID = cn.CreditNotes ID)sub 然后加入这个子查询由相同的3列idr。

此外,你最好由IDR.itemname,IDR.itemid和IDR组。date