使用Oracle SQL计算毛利率

时间:2016-06-23 16:46:12

标签: sql oracle

免责声明:我对SQL有点新鲜。

我正在处理一个查询,计算发票上每件商品的毛利率百分比。我想总结百分比毛利率为20%或以下的项目的美元金额毛利率。

所有必需的信息都在一个名为“发票”的表格中。该表的样本位于图像

enter image description here我们的'401%'帐户是收入帐户,而我们的'500%'帐户是商品帐户的费用。

我目前正在处理的查询是:

SELECT SUM(-AMOUNT) /
  (SELECT SUM(-AMOUNT)
   FROM INVOICES
   WHERE GL_ACCOUNT_ID LIKE '401%')
FROM INVOICES
WHERE GL_ACCOUNT_ID LIKE '401%'
  OR GL_ACCOUNT_ID LIKE '500%'
GROUP BY INVOICE_ID,
         ITEM_ID;

上述查询的问题在于它给了我项目保证金/公司收入而不是项目保证金/项目收入。任何帮助将非常感激。如果我不清楚,请告诉我。

3 个答案:

答案 0 :(得分:0)

这样的事情:

SELECT SUM( -AMOUNT ) /
  NULLIF( SUM( CASE WHEN GL_ACCOUNT_ID LIKE '401%'
                 THEN -AMOUNT
                 ELSE 0
               END ), 0 )
FROM INVOICES
WHERE ( GL_ACCOUNT_ID LIKE '401%'
     OR GL_ACCOUNT_ID LIKE '500%' )
GROUP BY INVOICE_ID,
         ITEM_ID;

答案 1 :(得分:0)

尝试相关的子查询:

SELECT SUM(-i.AMOUNT) / 
    (SELECT SUM(-s.AMOUNT) 
    FROM INVOICES s 
    WHERE GL_ACCOUNT_ID LIKE '401%' 
        AND s.ITEM_ID = i.ITEM_ID)
FROM INVOICES i
WHERE i.GL_ACCOUNT_ID LIKE '401%'
  OR i.GL_ACCOUNT_ID LIKE '500%'
GROUP BY i.INVOICE_ID,
         i.ITEM_ID

答案 2 :(得分:0)

以下查询会为每个发票上的每个项目创建一组新行,同时显示收入和费用。 (我包括了数量,虽然表中显示的“金额”似乎已经考虑了数量。)我改变了收入金额的标志 - 如果有的话,成本应该显示为负数,你在设置中反转它们。

select r.invoice_id, r.quantity, r.item_id, -r.amount as revenue, c.amount as cost
from   (select invoice_id, quantity, item_id, amount 
        from   invoices 
        where  gl_account_id like '401%') r
join   (select invoice_id, item_id, amount 
        from   invoices
        where  gl_account_id like '500%') c
    on  r.invoice_id = c.invoice_id
    and r.item_id    = c.item_id
;

这会产生以下结果:

INVOICE_ID   QUANTITY ITEM_ID       REVENUE       COST
---------- ---------- ---------- ---------- ----------
     42811          1 GLV-L              10          5
     42811          1 GLV-M              20         19
     42811          1 GLV-S              30         28

3 rows selected.

现在很容易将毛利率小于或等于20%的行累计毛利率(定义为收入减去成本)。请注意,最后一个条件相当于成本> = 0.8 *收入;我用这种方式写了条件。理想情况下,20%应该是输入 - 您可以使用绑定变量或其他一些机制来允许20%成为用户输入。 (那么我的0.8应该是1 - 这个值)。

我使用上面的查询作为子查询,在“with”子句中;如果您的Oracle版本较旧,则可能无法使用,您可能需要重写查询以将其作为传统子查询包含在内。

结果由invoice_id逐项列出;如果你想要一个总计,只需省略“group by”子句,结果将是整个表格的总计。

with amounts as (
      select r.invoice_id, r.quantity, r.item_id, -r.amount as revenue, c.amount as cost
      from   (select invoice_id, quantity, item_id, amount 
              from   invoices 
              where  gl_account_id like '401%') r
      join   (select invoice_id, item_id, amount 
              from   invoices
              where  gl_account_id like '500%') c
          on  r.invoice_id = c.invoice_id
          and r.item_id    = c.item_id
     )
select invoice_id, sum(revenue - cost) as gross_amt_for_low_margins
from   amounts
where  cost >= 0.8 * revenue
group by invoice_id
;

结果:

INVOICE_ID GROSS_AMT_FOR_LOW_MARGINS
---------- -------------------------
     42811                         3

1 row selected.