免责声明:我对SQL有点新鲜。
我正在处理一个查询,计算发票上每件商品的毛利率百分比。我想总结百分比毛利率为20%或以下的项目的美元金额毛利率。
所有必需的信息都在一个名为“发票”的表格中。该表的样本位于图像
中我们的'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;
上述查询的问题在于它给了我项目保证金/公司收入而不是项目保证金/项目收入。任何帮助将非常感激。如果我不清楚,请告诉我。
答案 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.