[英]sql query to merge data from two tables
我正在尝试编写查询(针对Oracle)。 我有三个表:
sale
====================================
sale_id | part_id | amt | cost | qty
quote
==============================
quote_id | part_id | amt | qty
part
================
part_id | number
而且我需要编写一个查询,按零件号将数字分组,类似于以下(非功能性)查询:
select p.number
sum(s.amt * s.qty) as sales_amt_total,
sum(s.qty) as sales_qty_total,
count(s.sale_id) as sales_count,
sum(s.qty * s.cost) as cost_total,
sum(q.amt * q.qty) as quotes_amt_total,
sum(q.qty) as quotes_qty_total,
count(q.quote_id) as quotes_count
from parts p
inner join quotes q on q.part_id = p.part_id
inner join sales s on s.part_id = p.part_id
group by p.number
having sales_amt_total < ?
and sales_amt_total > ?
and sales_qty_total < ?
and sales_qty_total > ?
and sales_count < ?
and sales_count > ?
and cost_total < ?
and cost_total > ?
and quotes_amt_total < ?
and quotes_amt_total > ?
and quotes_qty_total < ?
and quotes_qty_total > ?
and quotes_count < ?
and quotes_count > ?
;
产生这样的结果:
number | sales_amt_total | sales_qty_total | sales_count | cost_total | ...
---------------------------------------------------------------------------
P1 | 9999999 | 9999999 | 9999999 | 9999999 | ...
P2 | 9999999 | 9999999 | 9999999 | 9999999 | ...
P3 | 9999999 | 9999999 | 9999999 | 9999999 | ...
但是, inner join quotes
和inner join sales
会产生虚增的数字,因为它每次都会为每个匹配项进行计算。
我可以将它们分为两个查询:
select p.number
sum(s.amt * s.qty) as sales_amt_total,
sum(s.qty) as sales_qty_total,
count(s.sale_id) as sales_count,
sum(s.qty * s.cost) as cost_total,
from parts p
inner join sales s on s.part_id = p.part_id
having sales_amt_total < ?
and sales_amt_total > ?
and sales_qty_total < ?
and sales_qty_total > ?
and sales_count < ?
and sales_count > ?
and cost_total < ?
and cost_total > ?
;
select p.number
sum(q.amt * q.qty) as quotes_amt_total,
sum(q.qty) as quotes_qty_total,
count(q.quote_id) as quotes_count
from parts p
inner join quotes q on q.part_id = p.part_id
group by p.number
having quotes_amt_total < ?
and quotes_amt_total > ?
and quotes_qty_total < ?
and quotes_qty_total > ?
and quotes_count < ?
and quotes_count > ?
;
但是我无法将having
子句应用于每个表。
您将如何创建此查询?
类似于以下内容:
WITH ctePART_QUOTES AS
(SELECT qq.PART_ID,
COUNT(*) AS QUOTES_COUNT
SUM(qq.AMT * qq.QTY) AS QUOTES_AMT_TOTAL,
SUM(qq.QTY) as QUOTES_QTY_TOTAL
FROM QUOTES qq
GROUP BY qq.PART_ID),
ctePART_SALES AS
(SELECT ss.PART_ID,
COUNT(*) AS SALES_COUNT,
SUM(ss.AMT * ss.QTY) AS SALES_AMT_TOTAL,
SUM(ss.QTY) AS SALES_QTY_TOTAL,
COUNT(*) AS SALES_COUNT,
SUM(ss.QTY * ss.COST) AS COST_TOTAL
FROM SALES ss
GROUP BY ss.PART_ID)
SELECT p.NUMBER,
s.SALES_AMT_TOTAL,
s.SALES_QTY_TOTAL,
s.SALES_COUNT,
s.COST_TOTAL,
q.QUOTES_AMT_TOTAL,
q.QUOTES_QTY_TOTAL,
q.QUOTES_COUNT
FROM PARTS p
LEFT OUTER JOIN ctePART_QUOTES q
ON q.PART_ID = p.PART_ID
LEFT OUTER JOIN ctePART_SALES s
ON s.PART_ID = p.PART_ID
添加所有HAVING
的东西,你应该是好去。
祝你好运。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.