Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于合并两个表中数据的sql查询_Sql_Oracle - Fatal编程技术网

用于合并两个表中数据的sql查询

用于合并两个表中数据的sql查询,sql,oracle,Sql,Oracle,我正在尝试为Oracle编写一个查询。我有三张桌子: sale ==================================== sale_id | part_id | amt | cost | qty quote ============================== quote_id | part_id | amt | qty part ================ part_id | number 我需要编写一个查询,按照零件号对编号进行分组,类似于此非功能查询:

我正在尝试为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 > ?

;
但是,内部联接报价和内部联接销售创建了膨胀的数字,因为它每次都在计算每个匹配项

我可以将这些问题分为两个问题:

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
加上你所有的东西,你应该很好去


祝你好运。

向我们展示非功能性查询实际上对理解你的观点没有多大帮助。相反,请向我们展示样本表数据和预期输出。如果我能让它发挥作用,我就不会问问题样本输出在问题中如果你不能清楚地表达输入和输出数据,那么你要么不理解你自己的问题,或者你还没有充分考虑到它。只是考虑伪代码是为了传达功能,而不需要过度解释。
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